【问题标题】:Recursion function failed in CodeIgniterCodeIgniter 中的递归函数失败
【发布时间】:2012-07-18 15:24:55
【问题描述】:

我正在使用递归函数在树中转换我的菜单。我从数据库中得到的数组是:

array ( 
  [0] => stdClass Object ( 
    [nav_group_id] => 1 
    [entity_id] => 1 
    [parent] => 0 
    [name] => Meter Reading 
    [link] => # ) 
  [1] => stdClass Object ( 
    [nav_group_id] => 1 
    [entity_id] => 2 
    [parent] => 0 
    [name] => Parameterization 
    [link] => # ) 
  [2] => stdClass Object ( 
    [nav_group_id] => 1 
    [entity_id] => 3 
    [parent] => 0 
    [name] => View Reports 
    [link] => # ) 
  [3] => stdClass Object ( 
    [nav_group_id] => 1 
    [entity_id] => 4 
    [parent] => 0 
    [name] => Management & Control 
    [link] => # ) 
  [4] => stdClass Object ( 
    [nav_group_id] => 1 
    [entity_id] => 5 
    [parent] => 1 
    [name] => Billing Data 
    [link] => # ) 
  [5] => stdClass Object ( 
    [nav_group_id] => 1 
    [entity_id] => 6 
    [parent] => 1 
    [name] => MDI Billing Data
    [link] => # )

我通过将上述数组传递给该函数来调用递归函数:

$this->parseAndPrintTree('0',$navigation_all);
//die();   (issue here)

现在,如果我在此功能后使用die();,它会显示正确的菜单,如果不使用die();,页面将无法加载并出现此错误:

内容编码错误 您尝试查看的页面无法显示,因为它使用了无效或不受支持的压缩形式。”

...并且没有显示输出。这是我的递归函数:

function parseAndPrintTree($root, $tree) 
{
    $return = array();
    if(!is_null($tree) && count($tree) > 0) 
    {
        echo '<ul>';
        foreach($tree as $child => $parent) 
        {
            if($parent->parent == $root) 
            {                    
                unset($tree[$child]);
                echo '<li>'.$parent->name;
                $this->parseAndPrintTree($parent->entity_id, $tree);
                echo '</li>';
            }
        }
        echo '</ul>';
    }
}

【问题讨论】:

  • 您将die(); 放在函数之后的“修复”对于问题所在并没有决定性的意义。也就是说,不能保证你的错误真的来自你的递归函数。
  • @nickb 但我的代码很清楚,请指出其中是否有任何问题。我认为不会发生无限递归
  • @nickb 但我的代码很清楚,请指出其中是否有任何问题。我认为不会发生无限递归...而且我很确定问题出在递归函数,因为如果我不使用它,代码运行良好
  • 您是否在配置中打开了压缩? IE。 $config['compress_output'] = TRUE;?如果是,请尝试将其设置为 false。
  • @Bulk 你说的对!!!!!!!!!!我将 $config['compress_output'] 更改为 false 并且全部完成......但我也想压缩我的输出

标签: php codeigniter recursion anonymous-recursion


【解决方案1】:

为了后代,我在 Firefox 中处理 Code 2.1.0 时遇到了这个错误消息,然后我就来到了这里。我的问题是我的代码在子视图中生成了错误或警告。因为我的 /application/config/config.php 文件有这一行

$config['compress_output'] = TRUE;

我收到了与问题作者相同的错误消息。我改变了那行

$config['compress_output'] = FALSE;

然后,我能够看到我正在处理的真实错误。希望这对某人有帮助!

【讨论】:

    【解决方案2】:

    因为我似乎在做某事,所以我会发布这个作为答案。

    启用 gzip 压缩后,在压缩函数有机会输出之前,您无法向浏览器输出任何内容,Codeigniter 会在其执行堆栈接近尾声时自动执行此操作。在您的递归函数中,您有一个回显,它正在执行此输出。

    解决此问题的最佳方法是将此函数转换为 helper 函数,然后将对该函数的调用放在视图文件中,而不是我认为现在的控制器或库中。

    【讨论】:

    • 如果我想将树输出返回到控制器而不是使用 echo 我使用了变量 $arraged.='ul' 等,但它会导致相同的错误输出
    • 您是否将该变量传递给视图以在其中回显它?
    • 是的,我也在做同样的事情.....但不成功,请帮助我如何格式化这个变量并将其传递给查看
    • 而不是使用 echo 我想将输出添加到一些缓冲区类型变量,然后我想将它返回到调用函数的位置,然后将它传递给查看.....我试图做到了,但无法将输出附加到单个变量.....请批量帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2016-02-27
    相关资源
    最近更新 更多