J'ai un tableau avec des données d'arborescence (par iD parent). Je veux le convertir en une matrice multidimensionnelle. Quelle est la meilleure façon de réaliser cela? Y a-t-il une fonction courte pour cela?
Array Source: P>
$result = array( '0' => array( 'Menu' => array( 'id' => 45 'name' => 'Home' 'parent_id' => 1 ) 'Children' => array() ) '1' => array( 'Menu' => array( 'id' => 47 'name' => 'Get started' 'parent_id' => 1 ) 'Children' => array() ) '2' => array( 'Menu' => array( 'id' => 72 'name' => 'Attributes' 'parent_id' => 71 ) 'Children' => array() ) '3' => array( 'Menu' => array( 'id' => 73 'name' => 'Headings' 'parent_id' => 71 ) 'Children' => array() ) '4' => array( 'Menu' => array( 'id' => 75 'name' => 'Links' 'parent_id' => 71 ) 'Children' => array( '0' => array( 'Menu' => array( 'id' => 59 'name' => 'Images' 'parent_id' => 75 ) 'Children' => array() ) '1' => array( 'Menu' => array( 'id' => 65 'name' => 'Lists' 'parent_id' => 75 ) 'Children' => array() ) ) ) );
3 Réponses :
Je ne pense pas qu'il existe une fonction intégrée dans PHP, cela fait cela.
J'ai essayé le code suivant et il semble fonctionner pour préparer le tableau imbriqué comme vous décrivez: P> < pré> xxx pré>
J'ai écrit un algorithme similaire dans une classe PHP que j'ai écrit pour ma présentation Modèles hiérarchiques dans SQL et PHP , mais j'utilisais des objets au lieu de tableaux simples. p> p>
Vous êtes fantastique! Merci pour une solution de travail et une réponse rapide de sush! Le tableau source est le résultat de la requête de base de données.
Notez que cet algorithme ne fonctionne que si les parents apparaissent dans le résultat de la DB set avant que leurs enfants n'apparaissent.
J'ai écrit cette variante compte tenu de la racine parent_id est 0 ou manquante. Peu importe les enfants après les parents dans dB ($ source) ou non.
$source_by_id = array(); foreach ($source as &$row){ $source_by_id[$row['id']] = &$row; } foreach ($source_by_id as $id => &$row){ $source_by_id[ intval($row['parent_id']) ]['children'][$id] = &$row; } // remove cycling itself unset($source_by_id[0]['children'][0]); $result = $source_by_id[0]['children'];
Je cherchais un exemple de comment faire cela, avec des catégories. Cet exemple suppose que les parents auront toujours un identifiant parent de «0». L'exemple utilise zf2.
Pas de références, ni de récursivité. L'astuce est dans la sortie, vous recherchez l'index [0] et pour les enfants, vous spécifiez le parent_id comme l'index. P>
$categoryLookup = $this->getCategoryLookup($associateById=true); if ($assignedCategories) { $categoryHeirarchy = array(); foreach($assignedCategories as $assignedCategory) { $child = $categoryLookup[$assignedCategory->category_id]; $parent = $categoryLookup[$child->parent_id]; $categoryHeirarchy[$child->parent_id][] = $categoryLookup[$child->category_id]; $categoryHeirarchy[$parent->parent_id][$parent->category_id] = $categoryLookup[$parent->category_id]; } return $categoryHeirarchy; } <h3>Categories</h3> <dl class="dl-horizontal"> <?php foreach($this->categoryHeirarchy[0] as $parent): ?> <dt><?php echo $this->escapeHtml($parent->name); ?></dt> <?php foreach($this->categoryHeirarchy[$parent->category_id] as $child): ?> <dd><?php echo $this->escapeHtml($child->name); ?></dd> <?php endforeach; ?> <?php endforeach; ?> </dl>
Ce premier est déjà un tableau multidimensionnel. Multidimensionnelle signifie simplement des matrices à l'intérieur des tableaux.
euh ce n'est pas valide php .. Que fait [0] => tableau (... ou ["MENU '] => Array (... signifie? Donc, je suis plutôt coincé de ne pas comprendre la forme de vos données d'entrée .
@animuson: Ouais. vous avez raison. Je n'étais pas précis. Mais je pense que c'est clair ce que je veux, n'est-ce pas? @Spawncxy: Oui @scott: C'est un PHP valide. Les clés de tableau pourraient être des chaînes, pas seulement des chiffres
Vous savez que dans CakePHP, vous pouvez structurer votre modèle sous forme d'arborescence mpt appropriée, attachez le comportement de l'arborescence et simplement faire un
$ Model-> Rechercher («fileté») code> pour obtenir ce résultat? book.cakephp.org/view/1339/tree
@Deceze: Oui, je sais "fileté". Je pensais plus tôt à ce sujet. La matrice source dans ma question est le résultat de certaines manipulations avec le résultat de la requête. Il n'est pas facile de faire les manipulations avec une matrice «filetée». Il faudrait trop de questions pour faire une seule demande pour les résultats dont j'ai besoin. Donc, je ne fais qu'une requête, le mettre en cache et filtrer ce dont j'ai besoin de là et formater les tableaux après.