Problème :
Étant donné un ensemble de paires nom-nom-parent représentant des relations, la tâche est de les transformer en un nombre minimal de structures arborescentes imbriquées. Par exemple, avec l'entrée suivante :
Child : Parent H : G F : G G : D E : D A : E B : C C : E D : NULL
Le résultat attendu est une série d'arbres hiérarchiques :
D ├── E │ ├── A │ │ └── B │ └── C └── G ├── F └── H
Le but est de générer des arbres
Solution :
Pour convertir efficacement l'entrée en une structure arborescente hiérarchique, une approche récursive est utilisée. Les fonctions suivantes sont définies :
function parseTree($tree, $root = null): array { $return = []; foreach ($tree as $child => $parent) { if ($parent == $root) { unset($tree[$child]); $return[] = [ 'name' => $child, 'children' => parseTree($tree, $child), ]; } } return empty($return) ? null : $return; } function printTree($tree) { if (!is_null($tree) && count($tree) > 0) { echo '<ul>'; foreach ($tree as $node) { echo '<li>'.$node['name']; printTree($node['children']); echo '</li>'; } echo '</ul>'; } }
Utilisation :
$result = parseTree($tree); printTree($result);
Cette approche analyse d'abord l'entrée, créant une structure arborescente hiérarchique au format tableau. Par la suite, il parcourt l'arborescence, générant l'élément
Fonction combinée :
Pour une mise en œuvre plus efficace, une version combinée des deux fonctions peut être créée :
function parseAndPrintTree($root, $tree) { if (!is_null($tree) && count($tree) > 0) { echo '<ul>'; foreach ($tree as $child => $parent) { if ($parent == $root) { unset($tree[$child]); echo '<li>'.$child; parseAndPrintTree($child, $tree); echo '</li>'; } } echo '</ul>'; } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!