【问题标题】:Why value 4 gets printed even after it is deleted from array为什么即使从数组中删除值 4 也会打印
【发布时间】:2017-11-13 13:16:28
【问题描述】:

我编写了一个简单的程序来了解删除 foreach 循环中的数组元素对该循环的影响。我注意到即使我删除了元素 4,它仍然会被打印出来。为什么会这样?

代码:

$arr2 = array(1,2,3,4,5);

foreach($arr2 as $elem)
{
    echo '<br>val : '.$elem;

    $index=array_search(4,$arr2); // search for 4 in array

    if($index != false)
    {
       echo ' index :'.$index.' ';

       unset($arr2[$index]); // delete 4 from array 
    }
}

输出:

val : 1 index :3 
val : 2 
val : 3 
val : 4  // 4 gets printed !!
val : 5 

【问题讨论】:

  • 使用 foreach($arr2 as @elem)
  • 呃,不,不要……那不是 PHP
  • 你为什么要寻找数组每次迭代的索引?这可能导致各种奇怪的行为(例如,当搜索值多次出现时)。为什么不简单地在 foreach 之前进行过滤?
  • 你期望的输出是什么??

标签: php arrays


【解决方案1】:

将以下行改为:

foreach($arr2 as &$elem)

您还应该阅读 PHP referencesforeach 适用于您的数组的副本,而不是实际的数组。

【讨论】:

  • 因此它会引用实际数据。
  • &$elem 引用单个数据。它将如何影响实际数组?
  • @AL-zami 通过将 ref 添加到 $elem 而不是修改由 foreach 创建的 $arr2 数组的副本,您可以修改原始的实际数组。因此,当 unset($arr2[$index]) 执行时,它将按照您的预期从原始数组中删除您想要的条目,而不是从副本中删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多