登录

php中的array_walk无法unset引用数组,大家看看代码有没有什么问题?

代码如下:

    $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" }
# PHP
黄舟黄舟2185 天前415 次浏览

全部回复(2) 我要回复

  • 高洛峰

    高洛峰2017-04-10 15:24:39

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

    输出

    bar
    bar
    buy
    array(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
    以此类推。

    一般在遍历数组的时候去删除数组的中的元素是非常不建议的。
    会造成迭代器指向混乱。

    一般的方案是把要删除的数据放入一个新的数组里。然后再去遍历这个要删除的数组 再去删除原来的元素。

    回复
    0
  • 怪我咯

    怪我咯2017-04-10 15:24:39

    try php array_filter

    回复
    0
  • 取消回复发送