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

-1

Решение

Цитируя из PHP документы

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

мой акцент

1

Другие решения

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

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;
}
1