Kaç programcının masum bir şekilde array_values(array_filter())
yöntemi kodlarına kopyaladığı / yapıştırdığı konusunda endişeleniyorum - dizi_filter'in açgözlülüğü nedeniyle kaç programcının farkında olmadan sorunla karşılaştığını merak ediyorum. Daha da kötüsü, işlevin diziden çok fazla değeri sildiğini keşfeden kaç kişi ...
NULL
Bir diziden elemanların ayrılması ve anahtarların yeniden indekslenmesi için iki parçalı işlem için daha iyi bir alternatif sunacağım .
Bununla birlikte, öncelikle, açgözlü doğasını array_filter()
ve bunun projenizi sessizce nasıl baştan savacağını vurgulamalıyım . Sorunu açığa çıkaracak karışık değerler içeren bir dizi:
$array=['foo',NULL,'bar',0,false,null,'0',''];
Boş değerler, büyük / küçük harfe bakılmaksızın kaldırılacaktır.
Ancak array_values () & array_filter () kullandığımızda dizide ne kaldığına bakın :
array_values(array_filter($array));
Çıktı dizisi ($ dizi):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Şimdi, yeni bir filtrelenmiş dizi oluşturmak için array_walk () & is_null () kullanan yöntemimle ne elde ettiğinize bakın :
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Bu, daha kolay okunması / açıklanması için birden çok satıra yazılabilir:
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
}
}
);
Çıktı dizisi ($ filtre):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
Benim yöntemimle yeniden dizine alınmış anahtarlarınızı, boş olmayan tüm değerleri ve boş değerlerin hiçbirini alamazsınız. Tüm dizi null filtreleme ihtiyaçlarınız için temiz, taşınabilir, güvenilir tek astar. İşte bir gösteri .
Benzer şekilde, boş, yanlış ve boş öğeleri (sıfırları tutan) kaldırmak istiyorsanız, bu dört yöntem işe yarayacaktır:
var_export(array_values(array_diff($array,[''])));
veya
var_export(array_values(array_diff($array,[null])));
veya
var_export(array_values(array_diff($array,[false])));
veya
var_export(array_values(array_filter($array,'strlen')));
Çıktı:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Son olarak, dil yapılarının sözdizimini tercih eden herkes için, niteleyici değerleri yeni dizinler yayınlamak için yeni bir diziye de gönderebilirsiniz.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);