Я беспокоюсь о том, сколько программистов невинно скопировали / вставили метод 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);