Filter Fleksibel dengan array_filter
Saring array dengan aturan buatanmu sendiri memakai callback di array_filter.
Kenapa Callback Filter?
Modul array-search-filter mengenalkan array_filter sekilas. Sekarang kita dalami: kekuatan sebenarnya ada di callback, fungsi kecil yang menentukan "lolos atau tidak" untuk tiap item. Aturan bisa serumit apa pun: stok > 0 DAN harga < 20000, nama diawali huruf A, email valid. Tanpa callback, kamu terjebak pada syarat bawaan yang kaku.
<?php
// Contoh 1: filter multi-syarat (studi kasus toko)
$produk = [
["nama" => "Kopi", "stok" => 10, "harga" => 15000],
["nama" => "Teh", "stok" => 0, "harga" => 8000],
["nama" => "Roti", "stok" => 5, "harga" => 25000],
["nama" => "Susu", "stok" => 3, "harga" => 18000],
];
// Syarat: stok tersedia DAN harga di bawah 20000
$promo = array_filter($produk, function ($p) {
return $p["stok"] > 0 && $p["harga"] < 20000;
});
print_r(array_values($promo)); // Kopi dan SusuCallback mengembalikan boolean: true = pertahankan, false = buang. Semua logika kompleks (AND, OR, panggilan fungsi lain) boleh tinggal di dalamnya.
<?php
// Contoh 2: trik flag dan filter kunci
$input = ["nama" => "Sinta", "umur" => 17, "kota" => "", "hp" => null];
// Buang yang kosong (string "" dan null), tapi PERTAHANKAN 0 dan "0"
$bersih = array_filter($input, fn($v) => $v !== "" && $v !== null);
print_r($bersih); // nama, umur, (kota dan hp terbuang)
// Filter berdasar KUNCI, bukan nilai (flag ARRAY_FILTER_USE_KEY)
$data = ["nama" => "Sinta", "password" => "rahasia", "email" => "[email protected]"];
$aman = array_filter($data, fn($k) => $k !== "password", ARRAY_FILTER_USE_KEY);
print_r($aman); // password disingkirkan sebelum disimpan ke log!
// Filter dengan kunci DAN nilai (ARRAY_FILTER_USE_BOTH)
$pilih = array_filter($data, fn($v, $k) => $k === "email", ARRAY_FILTER_USE_BOTH);Tanpa callback, array_filter($arr) membuang semua yang falsy (termasuk 0 dan "0" yang mungkin valid). Callback eksplisit memberi kendali penuh atas definisi "kosong".
Jebakan yang Sering Terjadi
Lupa kunci asli dipertahankan. Hasil filter untuk [10, 0, 5] dengan syarat > 0 adalah [0 => 10, 2 => 5]: ada lompatan indeks. Selalu bungkus array_values() kalau hasil akan di-json_encode (kunci lompat membuat JSON menjadi object, bukan array!) atau diakses dengan indeks berurutan.
Callback mahal di dalam filter besar. Callback dipanggil untuk setiap item. Query database atau request HTTP di dalam callback untuk 10.000 item = bencana performa. Siapkan data berat di luar, callback hanya membandingkan.
Filter Bertingkat (Pipeline)
Filter sering dirangkai bertahap agar tiap langkah jelas:
<?php
$produk = [
["nama" => "Kopi", "stok" => 10, "harga" => 15000, "kategori" => "minuman"],
["nama" => "Teh", "stok" => 0, "harga" => 8000, "kategori" => "minuman"],
["nama" => "Roti", "stok" => 5, "harga" => 12000, "kategori" => "makanan"],
];
$ada = array_filter($produk, fn($p) => $p["stok"] > 0);
$minuman = array_filter($ada, fn($p) => $p["kategori"] === "minuman");
$murah = array_filter($minuman, fn($p) => $p["harga"] < 20000);
echo count($murah) . " produk minuman murah tersedia\n"; // 1: KopiTiap filter bernama implisit lewat variabelnya ($ada, $minuman, $murah): pembaca memahami pipeline tanpa komentar. Untuk performa data besar, gabungkan syarat dalam satu filter agar array hanya dijelajahi sekali.
Catatan teknis:
ARRAY_FILTER_USE_KEYdanARRAY_FILTER_USE_BOTHadalah flag yang mengubah apa yang diterima callback (kunci saja, atau kunci + nilai). Ini trik interview favorit untuk menyaring field sensitif sebelum logging.
Tantangan
Saring siswa lulus beasiswa
Diberi array asosiatif siswa (nama => nilai): ["Andi" => 85, "Budi" => 68, "Citra" => 92, "Dewi" => 74]. Gunakan array_filter dengan callback untuk menyisakan yang nilainya >= 75, lalu tampilkan dengan print_r.