8797 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai un soucis sur lequel je sèche depuis hier midi ... il ne s'agit que d'une vingtaine de lignes, mais ça ne fonctionne pas. Passer plus de 24 heures sur un si petit truc m'irrite vraiment, je m'en remets alors à vous ...

L'idée est simple, imaginons des produits contenus dans une famille de produit. Chaque famille pouvant elle même appartenir à une autre famille de produits, en clair, pour ce qui est des familles de produits, ça donnerait ceci :
- | Appareil photos
- | PC Portable
- | Prêt à porter
- | - | Homme
- | - | -| Jeans
- | - | Femme
- | - | -| Jeans
- | Papeterie

Je fais donc une requête MySQL demandant d'aller chercher toutes les familles de produits. Ce qui me retourne entre autre :


Array
(
    [0] => Array
        (
            [id_family] => 1
            [family_parent] => 0
            [family_name] => Appareil photos
        )
    [2] => Array
        (
            [id_family] => 2
            [family_parent] => 0
            [family_name] => PC Portable
        )
    [3] => Array
        (
            [id_family] => 3
            [family_parent] => 0
            [family_name] => Prêt à porter
        )
    [4] => Array
        (
            [id_family] => 4
            [family_parent] => 3
            [family_name] => Homme
        )
    [5] => Array
        (
            [id_family] => 5
            [family_parent] => 3
            [family_name] => Femme
        )
    [6] => Array
        (
            [id_family] => 6
            [family_parent] => 4
            [family_name] => Jeans
        )
}


L'idée est donc d'incorporer les familles dont le champs "famliy_parent" est renseigné dans le tableau respectif, comme suit :


Array
(
    [0] => Array
        (
            [id_family] => 1
            [family_parent] => 0
            [family_name] => Appareil photos
        )
    [2] => Array
        (
            [id_family] => 2
            [family_parent] => 0
            [family_name] => PC Portable
        )
    [3] => Array
        (
            [id_family] => 3
            [family_parent] => 0
            [family_name] => Prêt à porter
			[parent] => Array(
				[0] => Array
					(
						[id_family] => 4
						[family_parent] => 3
						[family_name] => Homme
					)
				[1] => Array
					(
						[id_family] => 5
						[family_parent] => 3
						[family_name] => Femme
						[parent] => Array(
							[0] => Array
								(
									[id_family] => 6
									[family_parent] => 4
									[family_name] => Jeans
								)
						)
					)
			)
        )
}


Savez-vous comment faire ?
Dans l'idée, je sais qu'il s'agit de créer plusieurs foreach() et je sais le réaliser jusqu'à deux colonnes, mais le nombre de familles de produits étant aléatoires, je ne parviens pas à aller plus loin ...
Merci beaucoup d'avance car je suis perdu Smiley ohwell
Modifié par Gaylord.P (26 Feb 2011 - 12:32)
Je pense que tu devrais utiliser la fonction is_array() qui renvoit true si le paramètre que tu lui passes est un array.

Tu mets le ton array dans une fonction récursive et le tour est joué... Google pour les mots compliqués et les détails sur la fonction si nécessaire Smiley smile
Salut et merci beaucoup d'avoir répondu Smiley smile

J'ai déjà longuement essayé avec is_array et array_merge pour l'ajout des données mais je n'y arrive pas ... sur un niveau oui, mais pas sur plus :s

Tu n'aurais pas un exemple ?
Merci d'avance Smiley smile
Et si tu as peur de la récursivité, tu peux aussi faire une requète sql par niveau (oui, c'est moins performant), en récupérant d'abord les éléments des catégories top niveau (family parent = 0), puis les éléments des catégories ayant un parent dans les catégories top niveau, avec un "in", et ainsi de suite par couche.
Effectivement c'est envisageable mais je crains que ce soit trop gourmand en ressource et qu'il serait plus judicieux de traiter ça par PHP Smiley confus
Gaylord.P a écrit :
Effectivement c'est envisageable mais je crains que ce soit trop gourmand en ressource et qu'il serait plus judicieux de traiter ça par PHP Smiley confus



Il ne faut jamais sous-estimer la puissance de MySQL par rapport à PHP, on a plus ou moins tous tendance a effectuer des opérations en PHP qui pourrait l'être [My]SQL avec moins de ressources.
En utilisant les requêtes préparées (avec PDO, bindParam et les bon paramètres de fetch par exemple), tu pourrais arriver assez facilement à ce résultat.

Sinon, toujours avec PDO, un mode qui peut te servir et simplifier les boucles : FETCH_UNIQUE
(une explication du mode ici : http://www.cloudconnected.fr/2007/10/17/les-fetch-modes-de-pdo-4-les-modes-modificateurs/)

Si tu avais un exemple de ton code jusque là, ça pourrait également permettre de t'apporter une aide plus précise Smiley cligne
Si tu veux le faire un PHP (et comme apparemment tu ne peux pas utiliser is_array() sur ton 1er tableau de résultats) , voilà un exemple que j'utilise dans un template pour afficher les catégories sous forme de listes imbriquées (j'ai remplacé les nom des index pour coller à ton tableau) :


function recursive_cat($categories=array(), $level=0) {
?>
	<ul<?php if($level === 0): ?> id="categories_list"<?php endif;?>>
	<?php foreach($categories as $child): ?>
		<?php if( $child['family_parent'] == $level ): ?>
		<li>
			<?php echo $child['family_name']; ?>
			<?php recursive_cat($categories, $child['id_family']); ?>
		</li>
		<?php endif; ?>
	<?php endforeach; ?>
	</ul>
<?php
}

recursive_cat($categories);

Modifié par jb_gfx (21 Feb 2011 - 12:55)
Merci beaucoup Smiley smile
Après pas mal de jours de recherche, la récursivité n'est pas top lorsqu'il y a beaucoup de sous catégories, j'ai donc préféré passer par des requêtes MySQL. Smiley smile

Encore merci (ton site est magnifique Smiley cligne )