【问题标题】:Simple array push in PHP exceeds allowed memory. (Allowed memory size of 33554432 bytes exhausted (tried to allocate 33554440 bytes) )PHP 中的简单数组推送超出了允许的内存。 (允许内存大小33554432字节用尽(尝试分配33554440字节))
【发布时间】:2021-04-12 06:01:42
【问题描述】:

此代码是更大程序的一部分,但我认为这是问题所在。我只需要在数组的相同索引处获得相同的值,这是我编写的代码:

$a1=array(1,1,2);
$a2=array(1,2);
$a3=array(1,1);
$a4=array(1,1,3);
$a5=array(1,1,1,1);

$same= array();
for($i=0; $i<3; $i++){
    while($a1[$i]==$a2[$i] && $a1[$i]==$a3[$i] && $a1[$i]==$a4[$i] && $a1[$i]==$a5[$i]){
        array_push($same, $a1[$i]);
    }
}
print_r($same);

它给了我这个错误:

允许的内存大小为 33554432 字节已用尽(尝试分配 33554440 字节)

在这里添加更多内存不是一种选择。

【问题讨论】:

  • 您能否正确解释一下您在此处实际需要实现的目标?我无法从您的描述中分辨出来,而且代码对我来说也没有足够的意义,无法从中分辨出来。 while($a1[$i]=$a2[$i]=$a3[$i]) - 这些是分配,所以该表达式的值将始终是 $a3[$i] - 你确定这就是你真正想要开始的吗?
  • 我想从 5 个不同的数组中获取相同键的相同值。我已经在我的while循环中使用“==”来检查相等性并像$a1[$i]==$a2[$i] &amp;&amp; $a1[$i]==$a3[$i] &amp;&amp; $a1[$i]==$a4[$i] &amp;&amp; $a1[$i]==$a5[$i]这样比较它们,但它仍然给我错误。
  • “我想从 5 个不同的数组中获取相同键的相同值。” - 仍然不清楚这到底是什么意思。请去阅读How to Ask,然后请给我们一个适当的解释 - 包括示例输入数据,以及基于此您期望得到的确切结果。
  • 使用帖子中给出的数组,以下循环应该输出具有相同键的值。因此,有了这些数组,$same 数组现在只能包含一个值。 [0] =&gt; 1 因为$a2 数组在下一个位置的编号已经与其他位置不同。
  • 我仍然不完全清楚你真正想要什么。为什么 for 循环会转到$i&lt;3,那个幻数从何而来?为什么在 for 中还有第二个循环?也许while 应该是一个简单的if?那么这可能开始有意义......

标签: php memory-management memory-leaks


【解决方案1】:

问题是你的while循环无限运行

while($a1[$i]=$a2[$i]=$a3[$i]){

你看到等号了吗?您只需从右到左将一个值分配给另一个值。如果你想检查它们是否都相等,你可以这样做:

while($a1[$i] == $a2[$i] &amp;&amp; $a1[$i] == $a3[$i] &amp;&amp; $a2[$i] == $a3[$i]){

总的来说,我认为代码可以&应该改进。您不应将 for loop 限制为硬编码数字。相反,将其限制为最小的数组长度。有很多方法可以解决这个问题。

编辑:

您的 while 循环无限运行,因为当索引 $i 为零时,所有值都相等并且它会卡在 while 循环中。将 while 循环 替换为 if。这将解决 内存大小错误,但您还应该在比较之前检查 keys 是否存在。

【讨论】:

  • 实际上我需要比较 5 个数组,我认为在这里简化它可能会有所帮助,但它没有。我在我的 while 循环中像这样比较它们:$a1[$i]==$a2[$i] &amp;&amp; $a1[$i]==$a3[$i] &amp;&amp; $a1[$i]==$a4[$i] &amp;&amp; $a1[$i]==$a5[$i] 但在将这些值推送到不同的数组时仍然会给出相同的错误。
  • 我明白了。顺便说一句,您将值推送到一个数组,然后打印一个空数组。这是故意的吗?
  • 忘记改了,变量是用不同的语言写的。
  • 如果可能,请使用原始代码更新您的问题。因为现在无限循环是由while循环内的赋值操作引起的
  • 与原始代码一样使用数组更新代码!
猜你喜欢
  • 2012-06-15
  • 2010-09-29
  • 1970-01-01
  • 2011-01-28
  • 2011-04-09
  • 1970-01-01
  • 2011-11-14
相关资源
最近更新 更多