2012-07-20 61 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