Di pelajaran Array kamu menyimpan dan membaca isi array. Di sini kita mengolah seluruh isinya sekaligus dengan fungsi bawaan PHP: menyaring, mengubah, meringkas, dan mengurutkan. Bayangin Bu Tini memegang setumpuk kartu harga menu. Dia memisahkan yang murah (menyaring), menulis harga baru di tiap kartu setelah ditambah ongkos bungkus (mengubah), menjumlahkan semuanya (meringkas), lalu menyusunnya dari yang termurah (mengurutkan). Tiap fungsi bawaan menerima satu fungsi kecil, callback, yang bilang apa yang dilakukan ke satu isi. Fungsi bawaannya yang mengulang ke semua isi. Callback-nya biasanya arrow function fn($h) => ... dari pelajaran Fungsi.
🧪 Tebakan cepat: Dari
$harga = [15000, 12000, 5000, 2000, 7000], kamu menyaring yang di bawah 10.000 ke$murah, lalu menulisecho $murah[0] ?? "kosong";. Yang tercetak5000ataukosong? Tebak dulu, jawabannya ada di bagian "array_filter: saring, key-nya tetap".
array_filter: saring, key-nya tetap
<?php
$harga = [15000, 12000, 5000, 2000, 7000];
$murah = array_filter($harga, fn($h) => $h < 10000);
print_r($murah);
Array
(
[2] => 5000
[3] => 2000
[4] => 7000
)
array_filter($array, $callback)memanggil callback untuk tiap isi. Isi yang dijawabtrueikut ke hasil, yang dijawabfalseditinggal.- Hasilnya array baru.
$hargatetap berisi 5 harga. - Key lamanya ikut. 5000 tetap di key 2, karena di
$hargadia memang di posisi 2. Jadi$murah[0]gak ada, dan$murah[0] ?? "kosong"mencetakkosong. Itu jawaban tebakannya. array_values($murah)menomori ulang dari 0:[0] => 5000,[1] => 2000,[2] => 7000.
array_map: ubah tiap isi
<?php
$harga = [15000, 12000, 5000];
$bungkus = array_map(fn($h) => $h + 1000, $harga);
print_r($bungkus);
Array
(
[0] => 16000
[1] => 13000
[2] => 6000
)
- Apa pun yang di-return callback jadi isi baru. Jumlah isinya selalu sama dengan array asli, dan key-nya ikut dipertahankan.
- Urutan argumennya kebalikan
array_filter:array_mapmenerima callback dulu, baru array-nya.array_map($harga, fn...)ditolak denganTypeError: array_map(): Argument #1 ($callback) must be a valid callback or null.
Saring lalu ubah bisa digabung: array_map(fn($n) => $n * 2, array_filter($angka, fn($n) => $n > 4)). Dari [3, 7, 2, 9, 1, 5, 8] hasilnya [1] => 14, [3] => 18, [5] => 10, [6] => 16: key dari array_filter ikut terbawa.
array_reduce dan array_sum: ringkas jadi satu nilai
<?php
$harga = [15000, 12000, 5000];
$total = array_reduce($harga, fn($carry, $h) => $carry + $h, 0);
echo $total . "\n"; // 32000
echo array_sum($harga); // 32000
0di akhir adalah nilai awal$carry, penampung hasil sementara.- Tiap putaran, callback menerima
$carrydan isi berikutnya, dan yang di-return jadi$carrybaru: 0 + 15000 = 15000, 15000 + 12000 = 27000, 27000 + 5000 = 32000. - Untuk sekadar menjumlah,
array_sumlebih singkat:array_sum([10, 20, 30])hasilnya60.
Mengurutkan: sort dan usort
<?php
$harga = [15000, 2000, 7000];
sort($harga);
echo $harga[0]; // 2000
sort mengurutkan dari kecil ke besar dan mengubah array aslinya. Dia gak mengembalikan array baru, cuma true, jadi $urut = sort($harga); berisi true.
Untuk daftar berisi baris (array di dalam array), pakai usort dengan callback pembanding:
<?php
$menu = [
["nama" => "Nasi Goreng", "harga" => 15000],
["nama" => "Es Teh", "harga" => 5000],
["nama" => "Mie Ayam", "harga" => 12000],
];
usort($menu, fn($a, $b) => $a["harga"] <=> $b["harga"]);
echo $menu[0]["nama"]; // Es Teh
<=>(operator spaceship) membandingkan dua nilai: hasilnya-1kalau kiri lebih kecil,0kalau sama,1kalau kiri lebih besar.usortmemakai jawaban itu untuk menyusun urutannya.- Tukar jadi
$b["harga"] <=> $a["harga"]untuk yang termahal dulu. sortdanusortsama-sama menomori ulang key dari 0.
📌 array_column dan spread
$hargaPerNama = array_column($menu, "harga", "nama");
// ["Es Teh" => 5000, "Mie Ayam" => 12000, "Nasi Goreng" => 15000]
$makanan = ["Nasi Goreng", "Mie Ayam"];
$minuman = ["Es Teh", "Es Jeruk"];
$semua = [...$makanan, ...$minuman]; // 4 menu dalam satu array
array_column mengambil satu kolom dari tiap baris, dan argumen ketiganya menjadikan kolom lain sebagai key. ... (spread) menuang isi array ke array baru.
⚠️ Jebakan yang sering ketemu
- Mengira hasil
array_filterbernomor 0, 1, 2. Key lamanya ikut, jadi$hasil[0]bisa gak ada, danjson_encodemengubahnya jadi object{"2":5000,"3":2000,"4":7000}. Rapikan denganarray_values. - Urutan argumen tertukar.
array_filter($array, $callback), tapiarray_map($callback, $array). $urut = sort($harga);berisitrue.sortmengubah$hargaitu sendiri.- Lupa menyimpan hasilnya.
array_filter($harga, ...)sendirian gak mengubah$harga. Simpan ke variabel, misalnya$murah = array_filter(...).
TL;DR: array_filter($array, fn($x) => syarat) menyimpan isi yang lolos dan mempertahankan key lamanya (rapikan dengan array_values). array_map(fn($x) => nilaiBaru, $array) mengubah tiap isi, callback-nya di depan. array_reduce($array, fn($carry, $x) => ..., 0) meringkas jadi satu nilai, dan array_sum menjumlahkan langsung. sort mengubah array aslinya dan mengembalikan true; usort($array, fn($a, $b) => $a <=> $b) mengurutkan dengan pembanding. Simpan hasil array_filter dan array_map ke variabel.