代碼如下:
$array = array(0 => 'bar', 1 => 'bat', 2=>'bar', 3=>'car', 4=>'buy',5=>'foo');array_walk($array, function($val,$key) use(&$array){ if(strpos($val, 'b')!==false){ unset($array[$key]); }}); var_dump($array);
輸出:
array(3) { [1]=> string(3) "bat" [3]=> string(3) "car" [5]=> string(3) "foo" }
回複內容:
代碼如下:
$array = array(0 => 'bar', 1 => 'bat', 2=>'bar', 3=>'car', 4=>'buy',5=>'foo');array_walk($array, function($val,$key) use(&$array){ if(strpos($val, 'b')!==false){ unset($array[$key]); }}); var_dump($array);
輸出:
array(3) { [1]=> string(3) "bat" [3]=> string(3) "car" [5]=> string(3) "foo" }
try php array_filter
php $array = array(0 => 'bar', 1 => 'bat', 2=>'bar', 3=>'car', 4=>'buy',5=>'foo');array_walk($array, function($val,$key) use(&$array){ echo $val."\n"; if(strpos($val, 'b')!==false){ unset($array[$key]); }}); var_dump($array);
輸出
barbarbuyarray(3) { [1] => string(3) "bat" [3] => string(3) "car" [5] => string(3) "foo"}
輸出這個$val就能看出端倪了。
第一次unset
變成
0 => 'bat',
1 => 'bar',
2 => 'car',
3 => 'buy',
4 => 'foo'
數組第二次遍曆,讀取索引為1的資料
所以unset($array[1]) 這時候消除的就是bar
以此類推。
一般在遍曆數組的時候去刪除數組的中的元素是非常不建議的。
會造成迭代器指向混亂。
一般的方案是把要刪除的資料放入一個新的數組裡。然後再去遍曆這個要刪除的數組 再去刪除原來的元素。