Ich möchte eine Funktion schreiben, die ein Array von Seiten / Kategorien (aus einem flachen Datenbankergebnis) verwendet und ein Array von verschachtelten Seiten- / Kategorieelementen basierend auf den übergeordneten IDs generiert. Ich würde dies gerne rekursiv machen, damit jede Ebene der Verschachtelung durchgeführt werden kann.
Beispiel: Ich rufe alle Seiten in einer Abfrage ab, und so sieht die Datenbanktabelle aus
+-------+---------------+---------------------------+
| id | parent_id | title |
+-------+---------------+---------------------------+
| 1 | 0 | Parent Page |
| 2 | 1 | Sub Page |
| 3 | 2 | Sub Sub Page |
| 4 | 0 | Another Parent Page |
+-------+---------------+---------------------------+
Und dies ist das Array, mit dem ich am Ende in meinen Ansichtsdateien arbeiten möchte:
Array
(
[0] => Array
(
[id] => 1
[parent_id] => 0
[title] => Parent Page
[children] => Array
(
[0] => Array
(
[id] => 2
[parent_id] => 1
[title] => Sub Page
[children] => Array
(
[0] => Array
(
[id] => 3
[parent_id] => 1
[title] => Sub Sub Page
)
)
)
)
)
[1] => Array
(
[id] => 4
[parent_id] => 0
[title] => Another Parent Page
)
)
Ich habe fast jede Lösung gesucht und ausprobiert, auf die ich gestoßen bin (es gibt viele hier auf Stack Overflow, aber ich hatte kein Glück, etwas Generisches zu bekommen, das sowohl für Seiten als auch für Kategorien funktioniert.
Hier ist der nächste, den ich bekommen habe, aber es funktioniert nicht, weil ich die Kinder dem Elternteil der ersten Ebene zuordne.
function page_walk($array, $parent_id = FALSE)
{
$organized_pages = array();
$children = array();
foreach($array as $index => $page)
{
if ( $page['parent_id'] == 0) // No, just spit it out and you're done
{
$organized_pages[$index] = $page;
}
else // If it does,
{
$organized_pages[$parent_id]['children'][$page['id']] = $this->page_walk($page, $parent_id);
}
}
return $organized_pages;
}
function page_list($array)
{
$fakepages = array();
$fakepages[0] = array('id' => 1, 'parent_id' => 0, 'title' => 'Parent Page');
$fakepages[1] = array('id' => 2, 'parent_id' => 1, 'title' => 'Sub Page');
$fakepages[2] = array('id' => 3, 'parent_id' => 2, 'title' => 'Sub Sub Page');
$fakepages[3] = array('id' => 4, 'parent_id' => 3, 'title' => 'Another Parent Page');
$pages = $this->page_walk($fakepages, 0);
print_r($pages);
}