將線性陣列(例如 mysql 記錄集)轉換為樹狀或多維陣列可能會很麻煩。利用 PHP 中的參考,我們可以透過一次迴圈,像這樣「堆疊」一個陣列
<?php
function array_stack (&$a, $p = '@parent', $c = '@children')
{
$l = $t = array();
foreach ($a AS $key => $val):
if (!$val[$p]) $t[$key] =& $l[$key];
else $l[$val[$p]][$c][$key] =& $l[$key];
$l[$key] = (array)$l[$key] + $val;
endforeach;
return $a = array('tree' => $t, 'leaf' => $l);
}
$node = array();
$node[1] = array('@parent' => 0, 'title' => 'I am node 1.');
$node[2] = array('@parent' => 1, 'title' => 'I am node 2.');
$node[3] = array('@parent' => 2, 'title' => 'I am node 3.');
$node[4] = array('@parent' => 1, 'title' => 'I am node 4.');
$node[5] = array('@parent' => 4, 'title' => 'I am node 5.');
array_stack($node);
$node['leaf'][1]['title'] = 'I am node one.';
$node['leaf'][2]['title'] = 'I am node two.';
$node['leaf'][3]['title'] = 'I am node three.';
$node['leaf'][4]['title'] = 'I am node four.';
$node['leaf'][5]['title'] = 'I am node five.';
echo '<pre>',print_r($node['tree'],TRUE),'</pre>';
?>
請注意,這裡沒有對陣列值進行參數檢查,但這只是為了保持函式大小精簡。可以輕鬆地在其中快速檢查以確保 $a 參數實際上是一個陣列。
希望你覺得它有用。非常感謝 IdeaShower.com 的 Nate Weiner 提供了我建構的原始函式。