Una función recursiva para clasificar los nodos padre e hijo en PHP usando un bucle foreach en una matriz
Tengo un conjunto de datos almacenado en una matriz que se hace referencia a sí mismo con ID de padres e hijos:id
, parent_id
, title
etc. El nivel superior tiene unaparent_id
de0
, y puede haber innumerables relaciones entre padres e hijos.
Así que estoy clasificando a través de esta matriz con unaforeach
bucle dentro de una función recursiva para verificar cada elemento de la matriz contra su elemento primario, y creo que he estado observando este método durante demasiado tiempo.
Terminé con los elementos en el orden correcto, pero parece que no puedo anidar mis listas correctamente, lo que me hace pensar que el método realmente no funciona.
¿Es esta la mejor ruta a tomar?¿Qué puedo hacer para mejorar y arreglar este método?¿Hay otro truco que pueda aplicar?Aquí está mi fuente:
<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>';
}
}
}
?>
Como siempre, cualquier ayuda es apreciada. Por favor, hágamelo saber si algo no está claro.