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