用Kohana框架编写的Gleez项目我正在用它来学习。 我有一些关于如何使用以下代码的问题。 它用于从给定信息生成树,然后递归函数使用此生成的树来创建结构。
我将查询结果$ tree提供给包含的函数 parent id = pid 循环遍历每个项目,检查是否设置了pid(使用isset),如果是,则将空数组$ d ['children']添加到当前项。引用用于在foreach循环中更改项的值。
我的问题是为什么使用引用,因为即使isset为false,也会添加空数组$ d ['children']?我想我只是不明白这个功能的使用。 2.为什么我的简化功能没有参考仍然添加$ item ['children']其中pid = Null
private function generate_tree($tree)
{
$menu = array();
$ref = array();
foreach($tree as $d)
{
$d['children'] = array();
if(isset($ref[$d['plid']]))
{
// we have a reference on its parent
$ref[ $d['plid'] ]['children'][ $d['mlid'] ] = $d;
$ref[ $d['mlid'] ] =& $ref[ $d['plid'] ]['children'][ $d['mlid'] ];
}
else
{
// we don't have a reference on its parent => put it a root level
$menu[$d['mlid']] = $d;
$ref[$d['mlid']] =& $menu[$d['mlid']]; // both pointing to the mlid
}
}
return $menu;
}
我简化了添加$ item ['children']的功能;如果设置了父ID,则生成$ tree。 我给generate_tree函数这些参数。
array(4){
[0]=> array(2)
{
["id"]=> string(1) "2"
["pid"]=> NULL
}
[1]=> array(2)
{
["id"]=> string(1) "3"
["pid"]=> NULL
}
[2]=> array(2)
{
["id"]=> string(1) "6"
["pid"]=> string(1) "2"
}
[3]=> array(2)
{
["id"]=> string(1) "8"
["pid"]=> string(1) "3"
}
}
private function generate_tree($menu) {
$tree = array();
foreach ($menu as $item) {
$item['children'] = array();
if (isset($tree[$item['pid']])){
$tree[$item['pid']['children']] = $item;
}
else{
$tree[$item['pid']] = $item;
}
}
return $tree;
}
$ tree的输出。如你所见[“pid”] => Null,但仍添加$ item ['children']。
array(3) {
[""]=> array(3)
{
["id"]=> string(1) "3"
["pid"]=> NULL
["children"]=> array(0) { }
}
[2]=> array(3)
{
["id"]=> string(1) "6"
["pid"]=> string(1) "2"
["children"]=> array(0) { }
}
[3]=> array(3)
{
["id"]=> string(1) "8"
["pid"]=> string(1) "3"
["children"]=> array(0) { }
}
}
提前谢谢!
答案 0 :(得分:0)
当您通过引用执行操作时,您正在使用相同的变量,您对它执行的任何操作都将被解析为任何其他引用的变量。
当不按引用执行操作时,您正在创建变量的副本,并且您对副本执行的任何操作都不会解析为任何其他复制的变量。
那为什么代码会这样写?它是这样完成的,所以程序员不必担心在找到匹配项时一直在树下更新数组。