2012-07-20 51 views
3

我写一些PHP代码,有点像这样:PHP:将一个数组作为foreach()的主题使用array_splice会导致问题吗?

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) 
     } 

    } 

它应该通过拒绝值的列表来搜索(过滤器[1]),发现如果更换存在,那么(如果有的话)增加在从拒绝列表中删除固定值时替换为良好值列表(过滤器[0])。

从foreach()中的foreach()的主要主题数组中删除值是否会导致此问题?

回答

5

编号foreach创建数组的副本。请看下面的代码:

$arr = array(1,2,3,4,5); 
foreach($arr as $k=>$v) { 
    if($v==1) { 
     unset($arr); 
    } 
    echo $v; 
} 

即使我们取消设置在第一个迭代整个原始阵列,这将仍然打印12345

+0

谢谢!这澄清了事情。 – SoItBegins 2012-07-20 23:16:43

1

简洁地回答这个问题:第

这样做的原因是,foreach作品与数组的副本,与写入时复制行为 - 只要您修改主题阵列副本是制作的,所以它不会影响循环。因为array_splice()不依赖于数组内部指针的当前位置,所以使用它是安全的。另一方面,current()不是。

我已经深入研究了这个话题,非常困惑,并且提出了一个关于SO的问题,它很好地解答了我的困惑,并详细解释了它的全部工作原理 - 可以找到here

+0

[阅读您发布的问题]哇,它比我想象的更复杂。谢谢! – SoItBegins 2012-07-20 23:17:05