Меня беспокоит, сколько программистов невинно скопировали / вставили array_values(array_filter())
метод в свои коды - мне интересно, сколько программистов невольно столкнулись с проблемами из-за жадности array_filter. Или, что еще хуже, сколько людей никогда не обнаруживали, что функция удаляет слишком много значений из массива ...
Я представлю лучшую альтернативу двухэтапному процессу удаления NULL
элементов из массива и повторной индексации ключей.
Однако, во-первых, чрезвычайно важно подчеркнуть жадность array_filter()
и то, как это может незаметно разрушить ваш проект. Вот массив со смешанными значениями, который выявит проблему:
$array=['foo',NULL,'bar',0,false,null,'0',''];
Нулевые значения будут удалены независимо от верхнего / нижнего регистра.
Но посмотрите, что остается в массиве, когда мы используем array_values () и array_filter () :
array_values(array_filter($array));
Выходной массив ($ array):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Теперь посмотрите, что вы получаете с моим методом, который использует array_walk () и is_null () для создания нового фильтрованного массива:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Это можно записать в несколько строк для облегчения чтения / объяснения:
array_walk( // iterate each element of an input array
$array, // this is the input array
function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
if(!is_null($v)){ // this literally checks for null values
$filtered[]=$v; // value is pushed into output with new indexes
}
}
);
Выходной массив ($ filter):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
С помощью моего метода вы получаете повторно проиндексированные ключи, все ненулевые значения и ни одно из нулевых значений. Чистый, портативный и надежный однострочник для всех ваших потребностей в фильтрации нулевого массива. Вот демонстрация .
Точно так же, если вы хотите удалить пустые, ложные и нулевые элементы (с сохранением нулей), эти четыре метода будут работать:
var_export(array_values(array_diff($array,[''])));
или
var_export(array_values(array_diff($array,[null])));
или
var_export(array_values(array_diff($array,[false])));
или
var_export(array_values(array_filter($array,'strlen')));
Вывод:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Наконец, для тех, кто предпочитает синтаксис языковых конструкций, вы также можете просто вставить соответствующие значения в новый массив для создания новых индексов.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);