array_walk仅部分删除匹配项

时间:2015-02-26 22:34:05

标签: php lambda reduction array-walk

使用array_walk()进入奇怪的情况只会部分删除我的方法中的匹配,而不确定究竟发生了什么。我目前正在使用PHP v5.6.4。问题几乎似乎是它只删除了所有次要比赛。

字距调整功能

private function strip(array $exceptions)
{
    array_walk($this->hosts, function($v, $k) USE ($exceptions)
    {
        foreach ($exceptions AS $exception)
        {
            if (preg_match("/{$exception}/i", strtolower($k)))
            {
                unset($this->hosts[$k]); break;
            }
        }
    });
    print_r($this->hosts); die;
}

2 个答案:

答案 0 :(得分:1)

PHP docs

引用
  

只有数组的值可能会被更改;它的结构不能改变,即程序员不能添加,取消设置或重新排序元素。如果回调不符合此要求,则此函数的行为未定义且不可预测。

我的重点

答案 1 :(得分:1)

这与Mark Ba​​ker提供的信息一起工作,感谢Mark。

private function strip(array $exceptions)
{
    $this->hosts = array_filter($this->hosts, function ($k) USE ($exceptions)
    {
        foreach ($exceptions AS $exception)
        {
            if (preg_match("/{$exception}/i", strtolower($k)))

                return false;
        }
        return true;
    }, ARRAY_FILTER_USE_KEY);

    return $this;
}