将线性数组(如 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' => '我是节点 1。');
$node[2] = array('@parent' => 1, 'title' => '我是节点 2。');
$node[3] = array('@parent' => 2, 'title' => '我是节点 3。');
$node[4] = array('@parent' => 1, 'title' => '我是节点 4。');
$node[5] = array('@parent' => 4, 'title' => '我是节点 5。');
array_stack($node);
$node['leaf'][1]['title'] = '我是节点一。';
$node['leaf'][2]['title'] = '我是节点二。';
$node['leaf'][3]['title'] = '我是节点三。';
$node['leaf'][4]['title'] = '我是节点四。';
$node['leaf'][5]['title'] = '我是节点五。';
echo '<pre>',print_r($node['tree'],TRUE),'</pre>';
?>
请注意,数组值没有参数检查,但这只是为了保持函数大小较小。可以轻松地在其中快速检查以确保 $a 参数实际上是一个数组。
希望您发现它有用。衷心感谢 IdeaShower.com 的 Nate Weiner 提供了原始函数,我基于它进行了构建。