Eine rekursive Funktion zum Sortieren von übergeordneten und untergeordneten Knoten in PHP mithilfe einer foreach-Schleife in einem Array
Ich habe einen Datensatz in einem Array gespeichert, das sich selbst mit Eltern-Kind-IDs referenziert:id
, parent_id
, title
usw. Die oberste Stufe hat eineparent_id
von0
Und es kann unzählige Eltern-Kind-Beziehungen geben.
Also sortiere ich dieses Array mit einemforeach
Schleife innerhalb einer rekursiven Funktion, um jedes Array-Element mit seinem übergeordneten Element zu vergleichen, und ich glaube, ich habe diese Methode zu lange angestarrt.
Ich habe zwar die Elemente in der richtigen Reihenfolge, aber ich kann meine Listen scheinbar nicht richtig verschachteln, weshalb ich denke, dass die Methode nicht wirklich funktioniert.
Ist dies der beste Weg?Was kann ich tun, um diese Methode zu verbessern und zu beheben?Gibt es einen anderen Trick, den ich anwenden kann?Hier ist meine Quelle:
<div>
<div>Subpages</div>
<ul>
<?php subPages($this->subpages->toArray(), 0) ?>
</ul>
<br>
<a href="javascript:;" onclick="">Add New Subpage</a>
</div>
<?php
function subPages($subpages, $parent){
foreach($subpages as $key => &$page){
$newParent = $page['id'];
//If the current page is the parrent start a new list
if($page['id'] == $parent)
{
//Echo out a new list
echo '<ul>';
echo '<li class="collapsed">';
echo '<a href="javascript:;" class="toggle">+</a>';
echo '<a href="javascript:;" onclick="">'.$page['title'].'</a>';
subPages($subpages, $newParent);
echo '</li>';
echo '</ul>';
}
//If the page's parent id matches the parent provided
else if($page['parent_id'] == $parent)
{
//Echo out the link
echo '<li class="collapsed">';
echo '<a href="javascript:;" class="toggle">+</a>';
echo '<a href="javascript:;" onclick="">'.$page['title'].'</a>';
//Set the page as the new parent
$newParent = $page['id'];
//Remove page from array
unset($subpages[$key]);
//Check the rest of the array for children
subPages($subpages, $newParent);
echo '</li>';
}
}
}
?>
Wie immer wird jede Hilfe geschätzt. Bitte lassen Sie mich wissen, wenn etwas nicht klar ist.