PHP:从数组结构打印完整文件路径会引发致命错误

时间:2014-08-15 22:22:42

标签: php

我有一个表示文件系统结构的数组结构

Array
(
    [.config] => Array
        (
            [0] => database.ini
            [1] => javascript.ini
            [3] => project.ini
            [5] => session.ini
            [6] => system.ini
            [.plugins] => Array
                (
                    [0] => comments.ini
                    [1] => user.ini
                )
...

我想用完整(相对)路径表示每个文件

Array
(
    [0] => config/database.ini
    [1] => config/javascript.ini
    [3] => config/project.ini
    [5] => config/session.ini
    [6] => config/system.ini
    [7] => config/plugins/comments.ini
    [8] => config/plugins/user.ini
...

为此,我写了这个函数

function recur($elem){
    if(is_array($elem)){
        return recur($elem);
    }else{
        return $elem;
    }
}

它正在给我

  

致命错误:允许的内存大小为134217728字节耗尽(尝试分配65488字节)

2 个答案:

答案 0 :(得分:3)

问题是您的递归函数永远不会终止,您传入一个数组,然后如果这是一个数组,您可以使用相同的数组调用相同的函数,依此类推。

你应该做的是递归嵌套级别:

function recur($elem){
  foreach($elem as $nested){
    if(is_array($nested)){
      return recur($nested);
    }else{
      return $nested;
    }
  }
}

这样你就可以在嵌套数组上使用函数,而不是你正在处理的外部函数,注意你可能需要根据想要的输出略微改变if / else条件,实际上返回意味着退出foreach,如果你想走所有数组级别,你应该避免返回并使用累加器来累积结果,但正如我所说,它取决于所需的输出。

答案 1 :(得分:0)

PHP正在尝试使用比允许更多的内存(在您的情况下,它限制为128 MiB)。

您必须调整php.ini中的memory_limit(请参阅http://www.ducea.com/2008/02/14/increase-php-memory-limit/)或找到一种不需要将所有路径存储在内存中的方法。

但是当你的recur - 方法进入无限递归时,这不会解决你的问题(它使用与调用它完全相同的参数调用自身,因此,它永远不会终止 - 增加php内存限制不会解决这个问题,因为你可能会遇到堆栈溢出。