arrayfungsifilterMenengah3 mnt baca

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
<?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 Susu

Callback mengembalikan boolean: true = pertahankan, false = buang. Semua logika kompleks (AND, OR, panggilan fungsi lain) boleh tinggal di dalamnya.

php
<?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
<?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: Kopi

Tiap 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_KEY dan ARRAY_FILTER_USE_BOTH adalah 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.