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 ответа

Решение

Цитирование из документов PHP

Только значения массива потенциально могут быть изменены; его структура не может быть изменена, т. е. программист не может добавлять, сбрасывать или изменять порядок элементов. Если обратный вызов не соответствует этому требованию, поведение этой функции не определено и непредсказуемо.

мой акцент

Это сработало в сочетании с информацией, предоставленной Марком Бейкером, спасибо Марку.

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;
}
Другие вопросы по тегам