8791 sujets

Développement web côté serveur, CMS

Bonjour, je travaille sur un système d'affichage de catégories.

Je récupère tout d'abord un array depuis ma base SQL.
Les champs de ma table sont : id parent_id slug type order name description

Et l'array que je récupère a cette forme :


$tree = 
Array ( 
	[ 0 ] => stdClass Object ( 
		[ id ] => 5 
		[ parent_id ] => 0 
		[ slug ] => jobs 
		[ type ] => type 
		[ order ] => 1 
		[ name ] => Jobs 
		[ description ] => ) 
	[ 1 ] => stdClass Object ( 
		[ id ] => 6 
		[ parent_id ] => 0 
		[ slug ] => prestation 
		[ type ] => type 
		[ order ] => 2 
		[ name ] => Prestation 
		[ description ] => ) 
	[ 2 ] => stdClass Object ( 
		[ id ] => 7 
		[ parent_id ] => 8 
		[ slug ] => candidature-spontanee 
		[ type ] => type 
		[ order ] => 1 
		[ name ] => Candidature Spontanée 
		[ description ] => ) 
	[ 3 ] => stdClass Object ( 
		[ id ] => 8 
		[ parent_id ] => 5 
		[ slug ] => services 
		[ type ] => type 
		[ order ] => 3 
		[ name ] => Services 
		[ description ] => ) 
	[ 4 ] => stdClass Object ( 
		[ id ] => 30 
		[ parent_id ] => 8 
		[ slug ] => 
		[ type ] => type 
		[ order ] => 2 
		[ name ] => Delicat 
		[ description ] => ) 
	[ 5 ] => stdClass Object ( 
		[ id ] => 33 
		[ parent_id ] => 7 
		[ slug ] => new-item 
		[ type ] => type 
		[ order ] => 4 
		[ name ] => New Item 
		[ description ] => 
		) 
) 


Maintenant, j'aimerais filtrer cet array pour sélectionner uniquement les parents ou les enfants d'un élément.

Comme ceci :

$parents = get_parents(30);

devrait me retourner


$parents = 
Array (
	[ 0 ] => stdClass Object ( 
		[ id ] => 5 
		[ parent_id ] => 0 
		[ slug ] => jobs 
		[ type ] => type 
		[ order ] => 1 
		[ name ] => Jobs 
		[ description ] => ) 
	[ 3 ] => stdClass Object ( 
		[ id ] => 8 
		[ parent_id ] => 5 
		[ slug ] => services 
		[ type ] => type 
		[ order ] => 3 
		[ name ] => Services 
		[ description ] => ) 
) 


Ici, c'est linéaire; chaque élément ne pouvant avoir qu'un parent.

Et

$children = get_children(8);

devrait me retourner


$children = 
Array ( 
	[ 2 ] => stdClass Object ( 
		[ id ] => 7 
		[ parent_id ] => 8 
		[ slug ] => candidature-spontanee 
		[ type ] => type 
		[ order ] => 1 
		[ name ] => Candidature Spontanée 
		[ description ] => ) 
	[ 4 ] => stdClass Object ( 
		[ id ] => 30 
		[ parent_id ] => 8 
		[ slug ] => 
		[ type ] => type 
		[ order ] => 2 
		[ name ] => Delicat 
		[ description ] => ) 
	[ 5 ] => stdClass Object ( 
		[ id ] => 33 
		[ parent_id ] => 7 
		[ slug ] => new-item 
		[ type ] => type 
		[ order ] => 4 
		[ name ] => New Item 
		[ description ] => 
		) 
) 


Ici, c'est pas linéaire car un élément peut avoir plusieurs enfants.

Mais je m'emmelle pas mal dans les fonctions récursives, etc.

Auriez-vous une idée ? Sachant que je ne veux pas reformater mon array d'entrée étant donné que mes autres fonctions marchent déjà très bien avec...

Merci beaucoup !
Modifié par gordie (31 Aug 2009 - 14:04)
Si tu as souvent besoin de ce genre de requêtes, tu aurais peut-être intérêt à changer ta table récursive contre une table à représentation. intervalaire. C'est beaucoup plus performant dans pas mal de cas.
La récursivité à les immense défauts d'être relativement lente et pas forcément très pratique à gérer, notamment dans le cas que tu présentes.