Martwię się, ilu programistów niewinnie skopiowało / wkleiło array_values(array_filter())
metodę do swoich kodów - zastanawiam się, ilu programistów nieświadomie napotkało problemy z powodu chciwości array_filter. Albo co gorsza, ilu ludzi nigdy nie odkryło, że funkcja usuwa zbyt wiele wartości z tablicy ...
Przedstawię lepszą alternatywę dla dwuczęściowego procesu usuwania NULL
elementów z tablicy i ponownego indeksowania kluczy.
Jednak po pierwsze, niezwykle ważne jest, aby podkreślić chciwość array_filter()
i sposób, w jaki może to po cichu ćwiczyć Twój projekt. Oto tablica z mieszanymi wartościami, które ujawnią problem:
$array=['foo',NULL,'bar',0,false,null,'0',''];
Wartości puste zostaną usunięte bez względu na wielkie / małe litery.
Ale spójrz na to, co pozostaje w tablicy, gdy używamy array_values () i array_filter () :
array_values(array_filter($array));
Tablica wyjściowa (tablica $):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Teraz spójrz na to, co dostajesz z moim metoda, która używa array_walk () & is_null () , aby wygenerować nowy przefiltrowaną tablicę:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Można to napisać w wielu wierszach, aby ułatwić czytanie / wyjaśnianie:
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
}
}
);
Tablica wyjściowa ($ filter):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
Dzięki mojej metodzie otrzymujesz ponownie indeksowane klucze, wszystkie wartości inne niż null i żadna z wartości null. Czysty, przenośny, niezawodny jednowarstwowy, spełniający wszystkie potrzeby macierzy w zakresie filtrowania zerowego. Oto demonstracja .
Podobnie, jeśli chcesz usunąć elementy puste, fałszywe i null (zachowując zera), te cztery metody będą działać:
var_export(array_values(array_diff($array,[''])));
lub
var_export(array_values(array_diff($array,[null])));
lub
var_export(array_values(array_diff($array,[false])));
lub
var_export(array_values(array_filter($array,'strlen')));
Wynik:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Wreszcie, dla każdego, kto preferuje składnię konstrukcji językowych, możesz po prostu wypchnąć wartości kwalifikujące do nowej tablicy, aby wydać nowe indeksy.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);