【问题标题】:memory issue when trying to create an array尝试创建数组时出现内存问题
【发布时间】:2012-09-17 16:00:08
【问题描述】:

我有一个我的公司用来根据输入动态创建一些文件的表单。我有一个文本区$fileString,他们可以输入文件名,然后是硬回车。我接受它并创建一个数组$list。我想要做的是,如果他们在文本区域中输入两个这样的文件名:

item1

item2

它将创建一个包含 6 个值的数组,而不是两个,所以像这样:

$genList = array(item1_f, item1_b, item1_i, item2_f, item2_b, item2_i);

我在运行代码时遇到了这个错误:

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 24 bytes) in /home/dcolor/public_html/dev/create.php on line 18

第 18 行是:

array_push($genList, $list[0] . "_f", $list[0] . "_b", $list[0] . "_i");

我在这里做错了什么?代码如下

    $fileString = $_POST['fileList'];
    $unique = $_POST['unique'];
    $size = $_POST['size'];
    $generateArray = $_POST['generateArray'];
    $list = explode("\r\n",$fileString);

    if ($generateArray == "yes") {      
        if ($size == "5x7inimpos") {
            $genList = array();
            while (!empty($list)) {             
                array_push($genList, $list[0] . "_f", $list[0] . "_b", $list[0] . "_i");                    
            }
        }
        print_r($genlist);
    }

【问题讨论】:

  • 我的第一个猜测是while(!empty($list)) {} 是一个无限循环。
  • Number 2 在相关的边栏中..

标签: php


【解决方案1】:
while (!empty($list)) {             
        array_push($genList, $list[0] . "_f", $list[0] . "_b", $list[0] . "_i");                    
}

$list 永远不会被清空,你永远不会退出 while 循环。

您只想遍历列表:

foreach($list as $element)
{

    array_push($genList, $element . "_f", $element . "_b", $element . "_i");                    

}

【讨论】:

    【解决方案2】:

    问题是

    while (!empty($list)) {             
        array_push($genList, $list[0] . "_f", $list[0] . "_b", $list[0] . "_i");                    
    }
    

    因为$list 永远不会为空,从而导致无限循环。 PHP 尝试将越来越多的元素推入$genList,直到超过内存限制。

    您可能想删除循环中的元素。

    【讨论】:

    • 我不明白为什么$list 永远不会为空。如果原始文本区域只有 4 个文件名值,$list 将包含 4 个数组值。第 4 次通过后它会变空,对吗?
    • 不,因为在 While 循环中,您不会从列表中删除任何内容。您正在无限次读取 $list[0] 中的值:)。在这种情况下,您可以像 moonwave99 的答案一样遍历列表。
    【解决方案3】:

    对我来说,这看起来像是一个无限循环。为什么$list 会变成空的?

    while (!empty($list)) {             
        array_push($genList, $list[0] . "_f", $list[0] . "_b", $list[0] . "_i");                    
    }
    

    因此,您将使用 array_push 分配内存,直到达到 [256MB] 内存限制。

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2011-01-19
      • 2019-04-19
      • 1970-01-01
      相关资源
      最近更新 更多