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

WBOY
发布: 2016-06-06 20:37:47
原创
918 人浏览过

代码如下:

<code>    $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);
</code>
登录后复制
登录后复制

输出:

<code>array(3) { [1]=> string(3) "bat" [3]=> string(3) "car" [5]=> string(3) "foo" }
</code>
登录后复制
登录后复制

回复内容:

代码如下:

<code>    $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);
</code>
登录后复制
登录后复制

输出:

<code>array(3) { [1]=> string(3) "bat" [3]=> string(3) "car" [5]=> string(3) "foo" }
</code>
登录后复制
登录后复制

try php array_filter

<code>php</code><code> $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);
</code>
登录后复制

输出

<code>bar
bar
buy
array(3) {
  [1] =>
  string(3) "bat"
  [3] =>
  string(3) "car"
  [5] =>
  string(3) "foo"
}
</code>
登录后复制

输出这个$val就能看出端倪了。

第一次unset
变成
0 => 'bat',
1 => 'bar',
2 => 'car',
3 => 'buy',
4 => 'foo'
数组第二次遍历,读取索引为1的数据
所以unset($array[1]) 这时候消除的就是bar
以此类推。

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

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

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!