Gleez项目的功能说明

时间:2015-03-10 09:53:04

标签: php foreach reference kohana

用Kohana框架编写的Gleez项目我正在用它来学习。 我有一些关于如何使用以下代码的问题。 它用于从给定信息生成树,然后递归函数使用此生成的树来创建结构。

我将查询结果$ tree提供给包含的函数 parent id = pid 循环遍历每个项目,检查是否设置了pid(使用isset),如果是,则将空数组$ d ['children']添加到当前项。引用用于在foreach循环中更改项的值。

  1. 我的问题是为什么使用引用,因为即使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;
    

    }

  2. 我简化了添加$ 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) { } 
            }
        }
    

    提前谢谢!

1 个答案:

答案 0 :(得分:0)

当您通过引用执行操作时,您正在使用相同的变量,您对它执行的任何操作都将被解析为任何其他引用的变量。

按引用执行操作时,您正在创建变量的副本,并且您对副本执行的任何操作都不会解析为任何其他复制的变量。

那为什么代码会这样写?它是这样完成的,所以程序员不必担心在找到匹配项时一直在树下更新数组。