Saya khawatir tentang berapa banyak programmer yang dengan polosnya menyalin / menempelkan array_values(array_filter())
metode ke dalam kode mereka - Saya bertanya-tanya berapa banyak programmer yang tanpa disadari mengalami masalah karena keserakahan array_filter. Atau lebih buruk, berapa banyak orang yang tidak pernah menemukan bahwa fungsi tersebut menghapus terlalu banyak nilai dari larik ...
Saya akan menyajikan alternatif yang lebih baik untuk proses dua bagian pengupasan NULL
elemen dari array dan mengindeks ulang kunci.
Namun, pertama-tama, sangat penting bagi saya untuk menekankan sifat serakah array_filter()
dan bagaimana hal ini dapat menghentikan proyek Anda secara diam-diam. Berikut adalah array dengan nilai campuran di dalamnya yang akan mengekspos masalah:
$array=['foo',NULL,'bar',0,false,null,'0',''];
Nilai nol akan dihapus terlepas dari huruf besar / kecil.
Tapi lihat apa yang tersisa dalam array ketika kita menggunakan array_values () & array_filter () :
array_values(array_filter($array));
Array keluaran ($ array):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Sekarang lihat apa yang Anda dapatkan dengan metode saya yang menggunakan array_walk () & is_null () untuk menghasilkan array baru yang difilter:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Ini dapat ditulis dalam beberapa baris agar lebih mudah dibaca / dijelaskan:
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
}
}
);
Array keluaran ($ filter):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
Dengan metode saya, Anda mendapatkan kunci yang diindeks ulang, semua nilai bukan nol, dan tidak ada nilai nol. Satu baris yang bersih, portabel, dan andal untuk semua kebutuhan penyaringan null array Anda. Ini sebuah demonstrasi .
Demikian pula, jika Anda ingin menghapus elemen kosong, salah, dan nol (mempertahankan nol), keempat metode ini akan berfungsi:
var_export(array_values(array_diff($array,[''])));
atau
var_export(array_values(array_diff($array,[null])));
atau
var_export(array_values(array_diff($array,[false])));
atau
var_export(array_values(array_filter($array,'strlen')));
Keluaran:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Terakhir, bagi siapa saja yang lebih menyukai sintaks konstruksi bahasa, Anda juga dapat memasukkan nilai yang memenuhi syarat ke dalam larik baru untuk menerbitkan indeks baru.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);