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.