对一个数组,连续两次进行foreach 遍历,第一次遍历通过 & 与符号改变元素值,第二次遍历不改变。两次之间不进行 reset指针。则会出现以外的数据异常,这个异常并不是报错,而是数据值改变了
foreach ($members as &$member)
{
$member['random_num'] = rand(10, 99);
}
foreach ($members as &$member)
{
$member['text'] = '这是文本';
}
我这样运行结果是,原本的最后第二个元素重复出现了两次,原本的最后一个元素值消失了(应该说是被覆盖了)。
然后我把代码得改成这样。在两次循环之间加 reset
<?php
foreach ($members as &$member)
{
$member['random_num'] = rand(10, 99);
}
reset($members);
foreach ($members as &$member)
{
$member['text'] = '这是文本';
}
我以为这样就可以了,但并不是。上面的截图,也不稳定。
要还是在循环内改变元素值还是用 key 数组键值对的方式最安全稳定。
foreach ($members as $i => $member)
{
$members[$i]['random_num'] = rand(10, 99);
}
foreach ($members as &$member)
{
$member['text'] = '这是文本';
}
两外我在PHP手册上看到了一段说明,有些想吐槽了。其实foreach 遍历的内部指针在使用一次之后,就不稳定了。
2021年7月14日 编辑
经过查手册,这个坑已经可避免了。对于连续循环同一数组且元素名相同时,要在每个循环后unset 元素,就可以了。
foreach ($members as &$member)
{
$member['random_num'] = rand(10, 99);
}
unset($members);
foreach ($members as &$member)
{
$member['text'] = '这是文本';
}