array_filter($array, $callback) mengembalikan elemen-elemen $array yang membuat $callback mengembalikan true (atau nilai apa pun yang dikonversi menjadi true). Array ditulis lebih dulu, callback kedua, dan elemen yang tetap ada mempertahankan key aslinya.
Key pada hasilnya adalah 1, 3, 5, 7: posisi nilai-nilai itu di array aslinya. Detail ini lebih penting daripada kelihatannya, dan bagian setelah bagian berikut menunjukkan cara mengatasinya.
Menghapus nilai kosong dari array
Panggil array_filter tanpa callback, dan fungsi ini membuang setiap nilai yang dikonversi menjadi false: string kosong, null, false, 0, "0", dan array kosong. Itulah cara tercepat untuk membersihkan potongan hasil explode() atau daftar field formulir.
Hasil pertama juga kehilangan "0" dan 0, padahal keduanya sering merupakan data sungguhan (jumlah barang nol, satu digit kode pos). Kalau nol adalah jawaban yang sah, tulis callback-nya sendiri, seperti pada panggilan kedua. Halaman empty berisi daftar lengkap nilai yang dianggap kosong oleh PHP.
Menomori ulang hasil dengan array_values
Karena key-nya dipertahankan, list yang sudah difilter bisa punya celah. Loop for yang dimulai dari 0 lalu akan menemui key yang hilang, dan json_encode mengubah hasilnya menjadi objek JSON, bukan array. array_values() menomorinya ulang.
Memfilter berdasarkan key dengan ARRAY_FILTER_USE_KEY
Argumen ketiga menentukan apa yang diterima callback. ARRAY_FILTER_USE_KEY hanya mengirim key. ARRAY_FILTER_USE_BOTH mengirim nilai, lalu key.
Untuk menyimpan sekumpulan key tetap yang sudah kamu ketahui, array_intersect_key($config, array_flip(['db_host', 'db_port'])) melakukan hal yang sama tanpa callback.
Memfilter array multidimensi
Kebanyakan data sungguhan berupa daftar baris. Callback menerima satu baris setiap kali, jadi kamu tinggal menguji field mana pun yang kamu butuhkan.
Ubah $maxPrice lalu jalankan lagi. Untuk mengambil namanya saja sesudahnya, kirim hasilnya ke array_column: array_column($affordable, 'name').
Filter, lalu map, lalu reduce
array_filter memilih elemen, array_map mengubahnya, dan array_reduce melipat array menjadi satu nilai. array_reduce($array, $callback, $initial) memanggil callback dengan total berjalan dan elemen berikutnya.
Untuk penjumlahan biasa, array_sum($totals) lebih pendek. array_reduce baru berguna saat hasilnya berupa hal lain: sebuah string, jumlah per kelompok, atau baris terbesar.
Kesalahan umum: mengubah nilai di dalam array_filter
Nilai kembalian callback hanya menentukan apakah sebuah elemen tetap ada. Apa pun lainnya yang dihitung akan dibuang, jadi kode ini tidak memangkas apa pun:
Ubah dulu dengan array_map, lalu filter, dan tambahkan array_values saat kamu butuh list yang rapi.
Pertanyaan yang sering diajukan
Bagaimana cara menghapus nilai kosong dari array di PHP?
Panggil array_filter($array) tanpa callback: fungsi ini membuang setiap nilai falsy ("", null, false, 0, "0", []). Untuk membuang string kosong dan null saja tetapi tetap menyimpan 0, berikan callback: array_filter($array, fn($v) => $v !== '' && $v !== null).
Kenapa array_filter mempertahankan key yang lama?
array_filter tidak pernah menomori ulang: elemen yang disimpan tetap berada di key aslinya, jadi sebuah list bisa kembali sebagai [0 => 'a', 2 => 'c']. Bungkus dengan array_values() untuk mendapatkan 0, 1, 2 lagi. Ini juga membuat json_encode menghasilkan array JSON, bukan objek.
Bagaimana cara memfilter array berdasarkan key di PHP?
Berikan ARRAY_FILTER_USE_KEY sebagai argumen ketiga, dan callback akan menerima key, bukan nilai: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Pakai ARRAY_FILTER_USE_BOTH untuk menerima nilai dan key sekaligus.
Apa bedanya array_filter dan array_map?
array_filter menentukan elemen mana yang tetap ada dan mengembalikannya tanpa perubahan. array_map mengubah setiap elemen dan mengembalikan jumlah elemen yang sama. Untuk melakukan keduanya, rangkai saja: array_map('strtoupper', array_filter($arr)).