修改PHP内存排气中的数组值

  • 本文关键字:数组 PHP 内存 修改 php
  • 更新时间 :
  • 英文 :


我的PHP代码如下:

foreach($collection as $key => $item) {
  $collection[$key]['column'] = 'test';
  $item['column'] = 'test';
}

当集合阵列有30,000行时,我会遇到此错误php致命错误:允许的内存大小为134217728字节耗尽(尝试分配89个字节(。

如果我删除了$ collection [$ key] ['linter'],则forloop可以成功完成。

我无法理解的是,这不是第2行和第3行基本相同吗?他们都在$集合数组中更改同一项目。

我在这里缺少什么?

要回答您的问题,让我们先快速查看foreach文档

在每次迭代中,当前元素的值分配给 $ value和内部阵列指针由一个提高 下一个迭代,您将查看下一个元素(。

首先,让我们提出您的第一个问题,让我们第二个问题。

我无法理解的是,这不是第2行和第3行 相同?

实际上它们不一样,以这些快速示例:

$array = ['a', 'a', 'a', 'a'];
foreach ($array as $key => $value) {
    $value = 'b';
}
print_r($array);
// Output : Array ( [0] => a [1] => a [2] => a [3] => a )

在第二种情况下:

$array = ['a', 'a', 'a', 'a'];
foreach ($array as $key => $value) {
    $array[$key] = 'b';
}
print_r($array);
// Output : Array ( [0] => b [1] => b [2] => b [3] => b )

因此,很明显,在您的第一种情况下,您已经修改了一些复制值或分配的值,因此不会触摸实际值。

因此,我们可以说-php函数具有自己的上下文,例如:

foreach ($array as $key => $value) {
    // $value variable will be only visible here
    // within the foreach context
}
echo $value; // will output Undefined variable

他们都在$ Collection数组中更改同一项目。

您可以说 - 或假设 - 您已经通过一个逐值foreach的变量,因此,如foreach docs 所述您的数组元素,而不是实际值。

在第二个示例中,您已经修改了数组$array的实际值,而不仅仅是它的副本。

在我的示例上下文中,要在该位置修改数组,您需要将变量传递给foreach通过参考,以便能够直接编辑您的数组值,例如:

$array = ['a', 'a', 'a', 'a'];
foreach ($array as $key => &$value) {
//                         ^
    $value = 'b';
}
print_r($array);
// Output : Array ( [0] => b [1] => b [2] => b [3] => b )

让我们转到您的另一个问题:

如果我删除了行$ collection [$ key] ['列'],则可以 成功完成。

这是发生的,因为如上所述,您将变量传递给按值foreach,因此对于30,000阵列上的每次迭代,PHP都会执行三个操作: -

1(将数组的每个元素复制到内存中的另一个位置
2(更新此复制元素
3(更新您的集合数组

我认为需要更多的内存,以使您的最大内存限制。

因此,正如Christopher在他的评论中提到的那样,如foreach doc页面所述:

为了能够直接修改循环中的数组元素 $ amp;。在这种情况下,值将由 参考。

通过参考传递您的价值可能会减少脚本的内存使用。

尝试使用以下方式:

ini_set('memory_limit', '-1');

这不是建议这样做,但是在您的情况下,这是需要的。这将覆盖默认的PHP内存限制。

最新更新