sort($array) mengurutkan array secara naik (ascending), langsung di array itu. Fungsi ini mengubah variabel yang kamu berikan dan mengembalikan true, jadi kamu memanggilnya di barisnya sendiri lalu memakai array-nya. rsort() mengurutkan secara turun (descending).
PHP punya fungsi sort untuk setiap kombinasi "berdasarkan nilai atau key", "naik atau turun", dan "key dipertahankan atau tidak":
| Fungsi | Urut berdasarkan | Urutan | Key |
|---|---|---|---|
sort | nilai | naik | dinomori ulang 0, 1, 2 |
rsort | nilai | turun | dinomori ulang |
asort | nilai | naik | dipertahankan |
arsort | nilai | turun | dipertahankan |
ksort | key | naik | dipertahankan |
krsort | key | turun | dipertahankan |
usort | fungsimu | pilihanmu | dinomori ulang |
uasort | fungsimu | pilihanmu | dipertahankan |
uksort | fungsimu pada key | pilihanmu | dipertahankan |
Mengurutkan array asosiatif berdasarkan nilai
sort() pada array asosiatif membuang key-nya. Pakai asort() untuk mengurutkan berdasarkan nilai sambil menjaga setiap key tetap bersama nilainya, atau arsort() untuk nilai tertinggi lebih dulu.
Mengurutkan array berdasarkan key dengan ksort
ksort() mengurutkan berdasarkan key, krsort() berdasarkan key secara terbalik. Ini praktis sebelum mencetak pengaturan atau membuat query string dengan urutan yang tetap.
Urutan buatan sendiri dengan usort dan operator spaceship
usort($array, $callback) membiarkanmu menentukan urutannya. Callback menerima dua elemen dan mengembalikan angka negatif kalau elemen pertama harus di depan, angka positif kalau elemen kedua yang harus di depan, dan 0 kalau keduanya sama. Operator spaceship <=> mengembalikan persis itu.
banana dan cherry panjangnya sama, jadi callback mengembalikan 0 untuk keduanya dan mereka tetap pada urutan yang sudah ada. Sort di PHP sudah stabil sejak PHP 8.0: elemen yang sama tetap pada urutan sebelumnya.
Mengurutkan array multidimensi berdasarkan sebuah nilai
Untuk mengurutkan list berisi baris data berdasarkan satu field, bandingkan field itu di usort. Untuk mengurutkan berdasarkan dua field, bandingkan array: <=> membandingkannya elemen demi elemen, jadi field kedua hanya menentukan urutan saat field pertama bernilai sama.
Perbandingan kedua menaruh $b["age"] di sisi kiri dan $a["age"] di sisi kanan, yang hanya membalik urutan umurnya. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) memberi urutan yang sama tanpa callback: fungsi ini mengurutkan berdasarkan kolom yang diambil, lalu menyusun ulang $people agar sesuai.
Urutan natural dan flag sort
Secara default, PHP membandingkan angka sebagai angka dan string sebagai string. Nama file yang berisi angka jadi terurut dengan cara yang tidak diharapkan orang: img10 muncul sebelum img2, dan setiap nama berhuruf besar muncul sebelum semua nama berhuruf kecil. Flag mengubah cara nilai dibandingkan.
SORT_NATURAL membaca deretan digit sebagai angka, SORT_FLAG_CASE mengabaikan huruf besar dan kecil, dan SORT_STRING memaksa perbandingan karakter demi karakter, bahkan untuk string numerik. natsort() dan natcasesort() punya ide yang sama, tetapi mempertahankan key-nya.
Kesalahan umum: menyimpan hasil sort ke variabel
Setiap fungsi sort mengembalikan true dan mengubah array yang kamu berikan. Menyimpan nilai kembaliannya membuat array-nya hilang:
Kalau kamu butuh salinan yang terurut dan ingin menjaga aslinya, salin dulu array itu ke variabel baru lalu urutkan salinannya, seperti yang dilakukan contoh asort di atas dengan $copy.
Pertanyaan yang sering diajukan
Kenapa sort() mengembalikan true, bukan array yang sudah diurutkan?
Fungsi sort di PHP mengurutkan array secara langsung, lewat reference, dan mengembalikan true. Panggil sort($arr); di barisnya sendiri dan pakai $arr sesudahnya. Menulis $arr = sort($arr); mengganti array-mu dengan true.
Bagaimana cara mengurutkan array asosiatif berdasarkan nilai tanpa kehilangan key-nya?
Pakai asort($arr) untuk urutan naik atau arsort($arr) untuk urutan turun. sort() dan rsort() juga mengurutkan berdasarkan nilai, tetapi membuang key-nya dan menomori ulang mulai dari 0.
Bagaimana cara mengurutkan array multidimensi berdasarkan sebuah nilai di PHP?
Pakai usort dengan operator spaceship pada field-nya: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. Tukar $a dan $b untuk urutan turun, dan bandingkan array seperti [$a['city'], $a['age']] <=> [$b['city'], $b['age']] untuk mengurutkan berdasarkan dua field.
Apakah sort di PHP stabil?
Ya, sejak PHP 8.0 semua fungsi sort stabil: elemen yang dianggap sama tetap pada urutan yang dimilikinya sebelum diurutkan. Itulah yang membuat pengurutan berdasarkan satu field lalu field lain bekerja sesuai harapan.
Bagaimana cara mengurutkan string yang berisi angka dalam urutan natural?
Pakai natsort($arr) atau sort($arr, SORT_NATURAL), yang menaruh img2 sebelum img10. Tambahkan SORT_FLAG_CASE (SORT_NATURAL | SORT_FLAG_CASE) atau pakai natcasesort untuk mengabaikan huruf besar dan kecil.