以下代码示例converts数组$array
进入您正在寻找的树结构:
// key the array by id
$keyed = array();
foreach($array as &$value)
{
$keyed[$value['id']] = &$value;
}
unset($value);
$array = $keyed;
unset($keyed);
// tree it
$tree = array();
foreach($array as &$value)
{
if ($parent = $value['parent_id'])
$array[$parent]['children'][] = &$value;
else
$tree[] = &$value;
}
unset($value);
$array = $tree;
unset($tree);
var_dump($array); # your result
这不起作用,如果有existing父 ID 即0
。但可以很容易地改变以反映这一点。
这是一个相关的问题,原始数组已经被键入,因此解决方案的前半部分可以省去:嵌套数组。第三层正在消失 https://stackoverflow.com/questions/7673044/nested-array-third-level-is-disappearing/7673415.
Edit:
那么这是如何运作的呢?这是利用 PHP 变量别名(也称为参考 http://www.php.net/manual/en/language.references.php)和(临时)数组,用于存储 a) 节点的别名($keyed
) 和 b) 构建新的树序 ($tree
).
您能[...]解释一下这样做的目的吗?$array = $keyed
, $array = $tree
和未设置的?
既,$keyed
and $tree
包含对值的引用$array
,我首先将该信息复制到$array
, e.g.:
$array = $keyed;
As now $keyed
仍然设置(并且包含对与中相同的值的引用$array
), $keyed
未设置:
unset($keyed);
这会取消设置中的所有引用$keyed
并确保,所有值$array
不再被引用(该值的引用计数减少一)。
如果迭代后未取消设置临时数组,则它们的引用仍然存在。如果你使用var_dump
on $array
,你会看到所有的值都有一个&
放在前面,因为它们仍然被引用。unset($keyed)
删除这些引用,var_dump($array)
再次,你会看到&
已经走了。
我希望这是可以理解的,如果您不熟悉参考文献,有时会很难理解它们。它经常帮助我将它们视为变量别名。
如果您想要锻炼身体,请考虑以下事项:
如何转换你的$array
通过一次 foreach 迭代从平面到树?
当您想要单击包含以下内容的链接时,请自行决定Solution http://codepad.viper-7.com/IUUDC4.