Construire un tableau PHP récursivement

VaN
Mammouth du PHP | 1107 Messages

22 oct. 2009, 15:46

Bonjour,

J'ai une table SQL, qui contient des familles de produits, sous cette forme :
families.gif
Comme vous pouvez le voir, certaines familles sont des enfants d'autres familles, autrement dit, des sous-familles.

J'aimerai créer une fonction, qui me retourne un tableau, contenant l'ensemble de ces familles, où les enfants, sont un tableau contenu dans le parent.

Quelque chose ressemblant à ça :

Code : Tout sélectionner

Array ( [0] => Array ( [family_id] => 1 [family_name] => Vetements [children] => Array ( [0] => Array ( [family_id] => 2 [family_name] => T-shirts [children] => Array ( [0] => Array ( [family_id] => 5 [family_name] => T-shirts Hommes ) ) ) [1] => Array ( [family_id] => 3 [family_name] => Pantalons ) ) ) [1] => Array ( [family_id] => 4 [family_name] => Informatique ) )
J'imagine qu'il faut que je fasse une fonction qui s'appelle elle-même, à un moment ou à un autre (il me semble que cela s'appelle une fonction récursive ?), mais je n'arrive pas à organiser ma réflexion pour trouver comment faire.

J'ai commencé à faire la fonction suivante, mais je reçois une erreur PHP et je ne sais pas trop pourquoi.
// Remplie un tableau contenant une famille, avec ses enfants, et retourne ce tableau
function fill_family_with_children($family_array) {
	global $config, $tables;
	
	$children = getDataFromQuery(sprintf("SELECT family_id, family_name FROM ".$tables["families"]." WHERE family_parent_id = '%d' AND family_statut = 1", 
	$family_array["family_id"]), true);
	
	if(!empty($children)) {
		
		//print_r_pre($children, "red");
		
		foreach($children as $key => $child) {
			
			//print_r_pre($child, "green");
			
			$children[$key] = fill_family_with_children($child);
		
		}
		
		$family_array["children"] = $children;
	}
	return $family_array;
}
Notice: Array to string conversion in lib\lib.main.php on line 866
Quelqu'un pourrait-il me donner un coup de pouce ?

Merci d'avance
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 oct. 2009, 17:45

Quelle est la ligne de code qui te provoque l'erreur : 866 ?

C'est une Notice, ça ne devrait pas empêcher complètement le traitement

VaN
Mammouth du PHP | 1107 Messages

22 oct. 2009, 20:46

C'est cette ligne là qui retourne l'erreur :

$family_array["children"] = $children;

EDIT : Je viens de me replonger un peu dans mon code, et j'ai fini par trouver la solution. Je poste ici les 2 fonctions qui me permettent de faire ce que je souhaitais :
// Remplie un tableau contenant une famille, avec ses enfants, et retourne ce tableau
function fill_family_with_children($family_array) {
	global $config, $tables;
	
	$children = getDataFromQuery(sprintf("SELECT family_id, family_name FROM ".$tables["families"]." WHERE family_parent_id = '%d' AND family_statut = 1", 
	$family_array["family_id"]), true);
	
	if(!empty($children)) {
		foreach($children as $key => $child) {
			$children[$key] = fill_family_with_children($child);
		}
		$family_array["children"] = $children;
	}
	return $family_array;
}

// Créer le tableau de familles pour le menu
function buildFamiliesArrayForMenu() {
	global $config, $tables;
	
	$parents = getDataFromQuery("SELECT family_id, family_name FROM ".$tables["families"]." WHERE family_parent_id = 0 AND family_statut = 1");
	
	if(!empty($parents)) {
		foreach($parents as $key => $parent) {
			$parents[$key] = fill_family_with_children($parent);
			
		}
	}
	return $parents;
}
Le tableau se construit, avec un simple appel :
$families_array = build_families_array_for_menu();