Bearbeiten:
Ich hatte zuvor eine Lösung gepostet, um ein mehrdimensionales Array aus der von Ihnen angegebenen Ausgabe zu erstellen, sowie eine Möglichkeit, alle untergeordneten Elemente einer bestimmten id
zu erhalten aus diesem bestimmten Array. Ich habe jetzt herausgefunden, wie ich die untergeordneten Elemente direkt aus Ihrer Ausgabe abrufen kann (ohne zuerst einen buildtree()
durchlaufen zu müssen Funktion:
function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array())
{
foreach($src_arr as $row)
{
if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)
{
$rowdata = array();
foreach($row as $k => $v)
$rowdata[$k] = $v;
$cats[] = $rowdata;
if($row['parent_id'] == $currentid)
$cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));
}
}
return $cats;
}
Um die obige Funktion zu verwenden, übergeben Sie einfach das Ausgabearray $data
zum ersten Argument und der id
aus dem Sie die untergeordneten Elemente im zweiten Argument abrufen möchten:
Bsp.:
$list = fetch_recursive($data, 3);
Das sollte Ihnen die richtige Array-Struktur für id
geben 3
(wie im Beispiel in der letzten Codebox zu dieser Antwort zu sehen).
Ursprüngliche Antwort:
Ich war bis jetzt noch nie dazu gekommen, eine rekursive Funktion zu schreiben, um verschachtelte Bäume aus diesem Design zu bauen. Ich bin mir sicher, dass es viele andere gibt, die ähnliche Funktionen geschrieben haben, aber diese sollte definitiv für Sie funktionieren:
function buildtree($src_arr, $parent_id = 0, $tree = array())
{
foreach($src_arr as $idx => $row)
{
if($row['parent_id'] == $parent_id)
{
foreach($row as $k => $v)
$tree[$row['id']][$k] = $v;
unset($src_arr[$idx]);
$tree[$row['id']]['children'] = buildtree($src_arr, $row['id']);
}
}
ksort($tree);
return $tree;
}
Diese Funktion erstellt rekursiv einen Baum aus einer Adjazenzliste und hält die IDs in aufsteigender Reihenfolge. Dadurch wird auch die id
's von jedem Elternteil/Kind der Schlüssel jedes Arrays von Informationen.
Dieser Code:
$r = mysql_query("SELECT * FROM test ");
$data = array();
while($row = mysql_fetch_assoc($r)) {
$data[] = $row;
}
echo '<pre>';
print_r(buildtree($data));
echo '</pre>';
'; Wird so etwas ausgeben:
Array
(
[1] => Array
(
[id] => 1
[name] => Electronics
[parent_id] => 0
[children] => Array
(
[2] => Array
(
[id] => 2
[name] => Televisions
[parent_id] => 1
[children] => Array
(
[4] => Array
(
[id] => 4
[name] => Tube
[parent_id] => 2
[children] => Array()
)
[5] => Array
(
[id] => 5
[name] => LCD
[parent_id] => 2
[children] => Array()
)
[6] => Array
(
[id] => 6
[name] => Plasma
[parent_id] => 2
[children] => Array()
)
)
)
[3] => Array
(
[id] => 3
[name] => Portable Electronics
[parent_id] => 1
[children] => Array
(
[7] => Array
(
[id] => 7
[name] => Mp3 Players
[parent_id] => 3
[children] => Array
(
[10] => Array
(
[id] => 10
[name] => Flash
[parent_id] => 7
[children] => Array()
)
)
)
[8] => Array
(
[id] => 8
[name] => CD Players
[parent_id] => 3
[children] => Array()
)
[9] => Array
(
[id] => 9
[name] => 2 Way Radios
[parent_id] => 3
[children] => Array()
)
)
)
)
)
)
Um alle untergeordneten Knoten einer bestimmten id
zu erhalten auf ein eindimensionales Array können Sie diese Funktion verwenden:
function fetch_recursive($tree, $parent_id, $parentfound = false, $list = array())
{
foreach($tree as $k => $v)
{
if($parentfound || $k == $parent_id)
{
$rowdata = array();
foreach($v as $field => $value)
if($field != 'children')
$rowdata[$field] = $value;
$list[] = $rowdata;
if($v['children'])
$list = array_merge($list, fetch_recursive($v['children'], $parent_id, true));
}
elseif($v['children'])
$list = array_merge($list, fetch_recursive($v['children'], $parent_id));
}
return $list;
}
Basierend auf buildtree()
Nehmen wir an, wir wollten alle untergeordneten Knoten von id
abrufen 3:
echo '<pre>';
print_r(fetch_recursive(buildtree($a), 3));
echo '</pre>';
'; Dies wird ausgeben:
Array
(
[0] => Array
(
[id] => 3
[name] => Portable Electronics
[parent_id] => 1
)
[1] => Array
(
[id] => 7
[name] => Mp3 Players
[parent_id] => 3
)
[2] => Array
(
[id] => 10
[name] => Flash
[parent_id] => 7
)
[3] => Array
(
[id] => 8
[name] => CD Players
[parent_id] => 3
)
[4] => Array
(
[id] => 9
[name] => 2 Way Radios
[parent_id] => 3
)
)