Daftar yang tampil di hadapan pengguna hampir selalu perlu diurutkan: papan peringkat dari nilai terbesar, daftar produk dari harga termurah, atau jadwal sesi dari waktu paling pagi. PHP menyediakan satu keluarga function sorting yang dinamai dengan pola konsisten, dan memilih anggota keluarga yang tepat menentukan apakah kunci array Anda selamat atau hilang. Pada Chapter ini kita membedah sort() sampai uksort(), membuktikan bahwa sorting PHP 8 bersifat stabil, lalu menyisipkan array_multisort() dan shuffle() sebagai pelengkap.

sort dan rsort — Mengurutkan Nilai #

sort() mengurutkan array dari nilai terkecil ke terbesar secara langsung (in-place): array aslinya diubah, bukan array baru yang dikembalikan. Konsekuensi penting yang sering menjebak pemula: kunci lama dibuang dan elemen dinomori ulang dari nol. Perhatikan contoh berikut:

php
<?php
$medali = [
    "Andi" => 3,
    "Budi" => 7,
    "Siti" => 5,
];

$peringkat = $medali;
sort($peringkat);

print_r($peringkat);

Output yang Dihasilkan:

text
Array
(
    [0] => 3
    [1] => 5
    [2] => 7
)

Baris $peringkat = $medali; membuat salinan terlebih dahulu agar array asli tetap utuh untuk dibandingkan. Setelah sort($peringkat), nilai terurut menjadi 3, 5, 7 — tetapi nama pemilik medali (Andi, Budi, Siti) hilang total karena kunci string diganti kunci integer 0, 1, 2. Adik rsort() bekerja sama persis dengan urutan terbalik (terbesar duluan) dan sama-sama membuang kunci.

asort dan arsort — Mengurutkan Nilai dengan Kunci Terpelihara #

asort() mengurutkan berdasarkan nilai tetapi mempertahankan pasangan kunci-nilai; elemen berpindah posisi bersama kuncinya. Pasangannya arsort() mengurutkan nilai dari terbesar ke terkecil:

php
<?php
$medali = [
    "Andi" => 3,
    "Budi" => 7,
    "Siti" => 5,
];

asort($medali);

foreach ($medali as $nama => $jumlah) {
    echo "$nama: $jumlah medali\n";
}

Output yang Dihasilkan:

text
Andi: 3 medali
Siti: 5 medali
Budi: 7 medali

Setelah asort(), iterasi $medali menghasilkan Andi (3), Siti (5), Budi (7) — urutan nilai naik sementara setiap nilai tetap menempel pada pemiliknya. Versi menurunnya terlihat pada contoh singkat berikut:

php
<?php
$medali = ["Andi" => 3, "Budi" => 7, "Siti" => 5];

arsort($medali);

echo implode(", ", array_keys($medali)) . "\n";

Output yang Dihasilkan:

text
Budi, Siti, Andi

Pemanggilan arsort() mengurutkan nilai medali dari terbesar, sehingga array_keys() — function yang kita pelajari pada chapter Array Keys dan Values — mengembalikan urutan papan peringkat: Budi, Siti, Andi.

ksort dan krsort — Mengurutkan Berdasarkan Kunci #

ksort() mengurutkan array berdasarkan kuncinya, sedangkan krsort() membalik urutannya. Nilai ikut berpindah mengikuti kuncinya sehingga pasangan tetap utuh:

php
<?php
$produk = ["zebra" => 3, "apel" => 1, "mangga" => 2];

ksort($produk);
echo implode(", ", array_keys($produk)) . "\n";

krsort($produk);
echo implode(", ", array_keys($produk)) . "\n";

Output yang Dihasilkan:

text
apel, mangga, zebra
zebra, mangga, apel

Pemanggilan ksort() menyusun kunci secara alfabetis menjadi apel, mangga, zebra, lalu krsort() membaliknya. Enam function dasar di atas dirangkum dalam tabel berikut:

FunctionDasar urutArahKunci lama
sort() / rsort()nilainaik / turundibuang, dinomori ulang
asort() / arsort()nilainaik / turundipertahankan
ksort() / krsort()kuncinaik / turundipertahankan

usort, uasort, dan uksort — Kriteria Buatan Sendiri #

Ketika urutan bawaan tidak cukup — misalnya mengurutkan array produk multidimensional berdasarkan harga — kita memakai usort() dengan callback perbandingan buatan sendiri. Callback menerima dua elemen dan mengembalikan bilangan negatif, nol, atau positif. Operator spaceship <=> (dibahas pada bagian comparison operator) menghasilkan ketiga nilai itu dalam satu ekspresi:

php
<?php
$produk = [
    ["nama" => "Kopi Gayo", "harga" => 85000],
    ["nama" => "Teh Melati", "harga" => 15000],
    ["nama" => "Gula Aren", "harga" => 32000],
];

usort($produk, function ($a, $b) {
    return $a["harga"] <=> $b["harga"];
});

foreach ($produk as $item) {
    echo $item["nama"] . " - Rp" . $item["harga"] . "\n";
}

Output yang Dihasilkan:

text
Teh Melati - Rp15000
Gula Aren - Rp32000
Kopi Gayo - Rp85000

Mari kita bedah cara kerjanya:

  1. function ($a, $b): PHP memanggil callback ini berulang kali dengan dua elemen dari $produk (bentuk fungsi tanpa nama ini akan dibahas tuntas pada Section Fungsi).
  2. $a["harga"] <=> $b["harga"]: spaceship mengembalikan -1 bila harga $a lebih kecil, 0 bila sama, dan 1 bila lebih besar — persis tiga nilai yang diminta aturan perbandingan.
  3. usort(): mengatur ulang $produk sampai semua pemanggilan callback konsisten, lalu menomori ulang kuncinya seperti sort().

Untuk mengurutkan menurun, cukup tukar posisi operan menjadi $b["harga"] <=> $a["harga"]. Saudara-saudaranya mengikuti pola keluarga: uasort() menjalankan perbandingan yang sama tetapi mempertahankan kunci, dan uksort() membandingkan dua kunci:

php
<?php
$jadwal = [
    "sesi3" => "13:00",
    "sesi1" => "09:00",
    "sesi2" => "11:00",
];

uasort($jadwal, function ($a, $b) {
    return $a <=> $b;
});

print_r($jadwal);

Output yang Dihasilkan:

text
Array
(
    [sesi1] => 09:00
    [sesi2] => 11:00
    [sesi3] => 13:00
)

Callback function ($a, $b) membandingkan dua nilai jam dengan spaceship operator, dan uasort() menyusun jadwal dari 09:00 hingga 13:00 tanpa kehilangan kunci sesi1 sampai sesi3.

Sorting yang Stabil di PHP 8 #

Sebuah sorting disebut stabil bila elemen yang dianggap sama tetap berada dalam urutan aslinya. Sejak PHP 8.0 seluruh function sorting dijamin stabil — pada PHP 7 dua elemen “sama” bisa bertukar posisi secara acak. Perhatikan demonstrasi berikut:

php
<?php
$pemain = [
    ["nama" => "Budi", "skor" => 90],
    ["nama" => "Siti", "skor" => 85],
    ["nama" => "Andi", "skor" => 90],
    ["nama" => "Rina", "skor" => 85],
];

usort($pemain, function ($a, $b) {
    return $a["skor"] <=> $b["skor"];
});

foreach ($pemain as $p) {
    echo $p["nama"] . " (" . $p["skor"] . ")\n";
}

Output yang Dihasilkan:

text
Siti (85)
Rina (85)
Budi (90)
Andi (90)

Callback hanya membandingkan skor, sehingga pasangan skor sama (Siti-Rina dan Budi-Andi) dianggap setara. Hasilnya menempatkan Siti sebelum Rina dan Budi sebelum Andi — persis urutan kemunculan aslinya. Jaminan stabil ini menyederhanakan banyak kasus nyata, misalnya mengurutkan pesanan menurut status lalu otomatis mempertahankan urutan waktu pembuatan di dalam tiap status.

array_multisort dan shuffle #

Dua operasi pengaturan urutan lain melengkapi keluarga sorting. Pertama, array_multisort() mengurutkan beberapa array sekaligus secara paralel — array pertama menjadi “pemimpin” urutan dan array berikutnya ikut bergeser mengikuti barisnya:

php
<?php
$nama = ["Budi", "Andi", "Siti"];
$umur = [25, 30, 22];

array_multisort($umur, $nama);

echo implode(", ", $umur) . "\n";
echo implode(", ", $nama) . "\n";

Output yang Dihasilkan:

text
22, 25, 30
Siti, Budi, Andi

Pemanggilan array_multisort($umur, $nama) mengurutkan $umur menjadi 22, 25, 30 dan memindahkan elemen $nama pada posisi yang sama: pemilik umur 22 adalah Siti, 25 Budi, 30 Andi. Pola ini juga dipakai untuk mengurutkan array of array berdasarkan satu kolom — topik lanjutan yang bisa digantikan usort() dengan callback yang lebih mudah dibaca.

Kedua, shuffle() mengacak urutan elemen secara acak sungguhan. Karena hasilnya berbeda pada setiap eksekusi, jangan pernah mencetak array yang baru diacak begitu saja — contoh berikut sengaja mengurutkan kembali hasil acakan agar keluarannya dapat diprediksi, sekaligus membuktikan tidak ada elemen yang hilang:

php
<?php
$nomorUndian = [1, 2, 3, 4, 5];

shuffle($nomorUndian);

sort($nomorUndian);

echo implode(", ", $nomorUndian) . "\n";

Output yang Dihasilkan:

text
1, 2, 3, 4, 5

Setelah shuffle(), urutan internal $nomorUndian acak dan kuncinya dinomori ulang dari nol — tetapi kelima elemennya tetap lengkap, seperti yang dibuktikan sort() pada baris berikutnya. Gunakan shuffle() untuk kebutuhan acakan seperti undian atau kartu; untuk urutan yang harus konsisten antar eksekusi, tetap gunakan keluarga sorting deterministik.

Ringkasan #

Pilihan function sorting ditentukan oleh dua pertanyaan: mengurutkan berdasarkan nilai atau kunci, dan bolehkah kunci lama dibuang. sort()/rsort() menomori ulang, asort()/arsort() dan ksort()/krsort() menjaga pasangan kunci-nilai, sementara varian u menerima callback perbandingan dengan spaceship operator. Sejak PHP 8 semua sorting stabil, array_multisort() mengurutkan banyak array paralel, dan shuffle() mengacak dengan hasil tak terprediksi. Urutan data sudah kuasai; selanjutnya kita belajar mencari dan menyaring elemen di dalam array dengan in_array(), array_search(), dan array_filter().

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php

/**
 * contoh.php — rangkuman Chapter Array Sorting.
 * Jalankan: php contoh.php
 */

// 1. asort mempertahankan kunci.
$medali = ["Andi" => 3, "Budi" => 7, "Siti" => 5];
asort($medali);
foreach ($medali as $nama => $jumlah) {
    echo "$nama: $jumlah medali\n";
}

// 2. arsort untuk papan peringkat (terbesar duluan).
arsort($medali);
echo "Juara umum: " . array_key_first($medali) . "\n";

// 3. usort dengan perbandingan khusus (spaceship operator).
$produk = [
    ["nama" => "Kopi Gayo", "harga" => 85000],
    ["nama" => "Teh Melati", "harga" => 15000],
    ["nama" => "Gula Aren", "harga" => 32000],
];
usort($produk, function ($a, $b) {
    return $a["harga"] <=> $b["harga"];
});
foreach ($produk as $item) {
    echo $item["nama"] . " - Rp" . $item["harga"] . "\n";
}