我正在写一些PHP代码,有点像这样:
foreach($filter[1] as $reject){
$reject_processed = preg_replace('~'s~','',strtolower($filter[1][$reject]));
if(array_key_exists($reject_processed,$list_of_common_replacements)){
$filter[0][] = $list_of_common_replacements[$reject_processed];
$filter[1] = array_splice($filter[1],$reject,1)
}
}
它应该搜索被拒绝值的列表(filter[1]),找到是否存在替换,然后(如果存在)将替换添加到好值列表(filter[0]),同时从拒绝列表中删除固定值。
从foreach()的主要主题数组中删除值会导致此问题吗?
否。foreach
创建数组的副本。考虑以下代码:
$arr = array(1,2,3,4,5);
foreach($arr as $k=>$v) {
if($v==1) {
unset($arr);
}
echo $v;
}
即使我们在第一次迭代中取消设置整个原始数组,这仍然会打印12345
。
简洁地回答这个问题:不。
原因是foreach
使用数组的副本,具有写时复制行为——只要修改主题数组,就会生成副本,因此不会影响循环。因为array_splice()
不依赖于数组内部指针的当前位置,所以使用它是安全的。而current()
则不然。
我已经深入研究了这个话题,非常困惑,并在SO上问了一个问题,这个问题很好地回答了我的困惑,并充分解释了它是如何在下面工作的——可以在这里找到。