php array_filter без сохранения ключа

если я фильтрую массив с array_filter для устранения нулевых значений, ключи сохраняются, и это генерирует «дыры» в массиве. Например:

The filtered version of [0] => 'foo' [1] => null [2] => 'bar' is [0] => 'foo' [2] => 'bar' 

Как я могу получить вместо этого

 [0] => 'foo' [1] => 'bar' 

? благодаря

Вы можете использовать array_values после фильтрации, чтобы получить значения.

Используя этот вход:

 $array=['foo',NULL,'bar',0,false,null,'0','']; 

Есть несколько способов сделать это. демонстрация

Это немного не по теме, чтобы вызвать array_filter поведение по умолчанию, но если вы переходите на эту страницу, это, вероятно, важная информация, относящаяся к вашему проекту / задаче:

 var_export(array_values(array_filter($array))); // NOT GOOD!!!!! 

Плохой выход:

 array ( 0 => 'foo', 1 => 'bar', ) 

Теперь о том, как это будет работать:

Метод # 1 : ( array_values() , array_filter() w / !is_null() )

 var_export(array_values(array_filter($array,function($v){return !is_null($v);}))); // good 

Метод # 2 : ( foreach() , автоиндексированный массив !==null )

 foreach($array as $v){ if($v!==null){$result[]=$v;} } var_export($result); // good 

Метод №3 : ( array_walk() , !is_null() массив !is_null() )

 array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}}); var_export($filtered); // good , array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}}); var_export($filtered); // good 

Все три метода обеспечивают следующий «нулевой» вывод:

 array ( 0 => 'foo', 1 => 'bar', 2 => 0, 3 => false, 4 => '0', 5 => '', )