arrayfilterMenengah4 mnt baca

Mencari & Filter Array

Temukan data dalam array: array_search, array_filter, array_map, dan array_column.

Kenapa Mencari & Memfilter Penting?

Program jarang memakai seluruh data sekaligus. Dari 1000 produk, tampilkan yang stoknya ada. Dari 200 siswa, cari yang namanya mengandung "putri". Searching menemukan item tertentu, filtering menyisakan item yang memenuhi syarat. Keduanya adalah operasi data paling fundamental setelah sorting.

php
<?php
// Contoh 1: mencari posisi dan keberadaan
$buah = ["apel", "mangga", "jeruk", "mangga"];

$pos = array_search("jeruk", $buah);   // 2: indeks tempat "jeruk" berada
var_dump($pos);

$tidakAda = array_search("durian", $buah);  // false: tidak ketemu
if ($tidakAda === false) {
    echo "Durian tidak ada di daftar.";
}

array_search() mengembalikan indeks/kunci item yang ketemu, atau false kalau tidak ada. Karena indeks bisa 0 (yang juga falsy), pengecekan wajib pakai === false, bukan == false atau !$hasil.

php
<?php
// Contoh 2: filter dengan array_filter (studi kasus toko)
$produk = [
    ["nama" => "Kopi", "stok" => 10, "harga" => 15000],
    ["nama" => "Teh", "stok" => 0, "harga" => 8000],
    ["nama" => "Roti", "stok" => 5, "harga" => 12000],
];

// Saring: hanya yang stok > 0
$tersedia = array_filter($produk, function ($p) {
    return $p["stok"] > 0;
});

// Ambil hanya nama-namanya
$namaTersedia = array_column($tersedia, "nama");
print_r($namaTersedia);   // ["Kopi", "Roti"]

array_filter() menerima callback: fungsi kecil yang dipanggil untuk setiap item, dan item dipertahankan hanya jika callback mengembalikan true. array_column() mengekstrak satu kolom dari array multidimensi, sangat berguna untuk data berbentuk tabel dari database.

Jebakan yang Sering Terjadi

array_search mengembalikan 0 dianggap tidak ketemu.

php
<?php
$pos = array_search("apel", $buah);  // 0 (indeks pertama)
if (!$pos) {
    echo "tidak ketemu";   // SALAH: 0 dianggap false!
}

Benar: if ($pos === false). Ini adalah salah satu bug PHP paling terkenal sepanjang masa.

array_filter mempertahankan kunci asli.

php
<?php
$hasil = array_filter([10, 0, 5, 0], fn($n) => $n > 0);
// $hasil = [0 => 10, 2 => 5], BUKAN [0 => 10, 1 => 5]!

Kunci yang lolos filter tetap seperti semula (0 dan 2), sehingga ada "lompatan". Kalau butuh indeks berurutan lagi, bungkus dengan array_values($hasil).

Mencari di Data Bertingkat

Untuk array multidimensi (data tabel), kombinasikan array_column + array_search:

php
<?php
$siswa = [
    ["nis" => "001", "nama" => "Andi"],
    ["nis" => "002", "nama" => "Budi"],
    ["nis" => "003", "nama" => "Citra"],
];

// Cari indeks baris dengan NIS "002"
$indeks = array_search("002", array_column($siswa, "nis"));
echo $siswa[$indeks]["nama"];   // "Budi"

// Atau ubah jadi map NIS => baris untuk pencarian berulang (lebih cepat!)
$map = array_column($siswa, null, "nis");
echo $map["003"]["nama"];   // "Citra": akses langsung O(1)

array_column($arr, null, "nis") membuat array asosiatif berdasar kolom kunci: pola standar "indexing" data agar pencarian berikutnya instan tanpa loop.

Catatan teknis: Untuk pencarian sederhana "apakah ada?", in_array() lebih tepat daripada array_search(). Pakai array_search() hanya saat kamu butuh tahu posisinya. Memilih fungsi yang tepat membuat maksud kode jelas bagi pembaca.

Tantangan

Cari siswa lulus

Dari array $siswa (nama, nilai) berisi 5 data, tampilkan: (1) nama-nama yang lulus (>= 70) via array_filter, (2) rata-rata nilai via array_column + array_sum + count.