【问题标题】:Explanation of function from Gleez projectGleez项目的功能说明
【发布时间】:2015-03-10 09:53:04
【问题描述】:

用 Kohana 框架编写的 Gleez 项目我正在使用它来学习。 我对以下代码的工作方式有一些疑问。 它用于根据给定的信息生成树,然后递归函数使用这个生成的树来创建结构。

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

  1. 我的问题是为什么要使用引用,因为即使 isset 为 false 空数组 $d['children'] 也会被添加?我想我只是不明白这个功能的用途。 2.为什么我没有引用的简化函数仍然添加 $item['children'] where 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) { } 
        }
    }

提前谢谢你!

【问题讨论】:

  • 您是否尝试过删除引用并检查如果这样做会发生什么?有时最好只是见证发生的事情:)
  • 是的,我确实简化了代码,删除了引用,我
  • 我会纠正我的问题,因为这是我的第一个问题,我认为它不是最好的。
  • 我认为这是一个有效的问题,您对引用的使用感到困惑。检查发生情况的最佳方法是将其删除,然后查看结果。

标签: php foreach reference kohana


【解决方案1】:

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

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

那为什么代码是这样写的呢?这样做是为了让程序员不必担心在找到匹配项时一直更新数组。

【讨论】:

  • 使用参考时。我想我不明白“所有原因”你能指出我正确的道路吗?
  • 您可以将数组视为一棵树。一棵树可以有很多分支,而分支也可以有很多分支。您可以步行/遍历分支,这意味着向下/穿过阵列或向上/离开阵列。在这个引用的示例中,程序员不必尝试维护层次结构,因为子元素是父元素的引用,其子元素是其父元素的引用。使用这个模型,我们只需要知道它的顶层位置就可以更新任何 n 个元素深度的分支。 “一路向下”表示没有额外的级别。
  • 你的解释很棒。但是还是不明白我的第二个没有参考的简化例子的问题。
  • 这是因为 PHP 类型是杂耍的。改用 is_null() 。提供了一个 link 来展示 PHP 的 is_null()、empty() 和 isset() 函数是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 2022-01-14
  • 2018-01-14
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多