【问题标题】:why the last element of array changed after 2 foreach loop? [duplicate]为什么数组的最后一个元素在 2 个 foreach 循环后发生了变化? [复制]
【发布时间】:2015-07-25 12:17:17
【问题描述】:

有什么魔力? $data 的最后一个元素在每个循环 2 之后发生了变化。

<?php
$data = array("1" => "a", "2" => "b");
print_r($data);
foreach($data as $k=>&$v) {}
foreach($data as $k=>$v) {}
print_r($data);

输出:[2] => 第二次 foreach 之后的 a

Array
(
    [1] => a
    [2] => b
)
Array
(
    [1] => a
    [2] => a
)

代码改成这个,数组不会变:

<?php
foreach($data as $k=>&$v) {}
foreach($data as $k=>&$v) {}

【问题讨论】:

  • 因为&amp;v$v 的引用和最后一个数组元素即使在 foreach 循环之后仍然存在。建议unset()销毁。
  • 我不明白,为什么引用改变了原始数组?我对那个参考什么都不做

标签: php arrays


【解决方案1】:

来自foreach 手册:

警告 $value 的引用和最后一个数组元素保持偶数 在 foreach 循环之后。建议通过 unset() 销毁。

所以在第一个foreach 的末尾,$v 是对数组中最后一个元素的引用。下一次foreach 的第一次迭代将$v 的值更改为第一个数组元素的值,这是对数组中最后一个元素的引用,因此它被更改了。

$data = array("1" => "a", "2" => "b");
print_r($data);
foreach($data as $k=>&$v) {}
unset($v);                     // *** UNSET HERE ***
foreach($data as $k=>$v) {}
print_r($data);

结果:

Array
(
    [1] => a
    [2] => b
)
Array
(
    [1] => a
    [2] => b
)

【讨论】:

  • 为什么 $value 的引用改变了 $data?我对这个引用没有做任何事情
  • 是的。或者更确切地说,您的第二个 foreach 循环确实如此。它为$v 分配一个新值,它仍然引用最后一个数组元素。
  • 是的,谢谢@ThiefMaster,我添加了描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2021-06-20
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
相关资源
最近更新 更多