PHP 7+
Pada PHP 7, ini dapat dilakukan secara ringkas menggunakan usort
dengan fungsi anonim yang menggunakan operator pesawat ruang angkasa untuk membandingkan elemen.
Anda dapat melakukan semacam naik seperti ini:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
Atau jenis menurun seperti ini:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Untuk memahami cara kerjanya, perhatikan bahwa usort
mengambil fungsi perbandingan yang disediakan pengguna yang harus berperilaku sebagai berikut (dari dokumen):
Fungsi perbandingan harus mengembalikan bilangan bulat kurang dari, sama dengan, atau lebih besar dari nol jika argumen pertama dianggap masing-masing kurang dari, sama dengan, atau lebih besar dari yang kedua.
Dan perhatikan juga bahwa <=>
, operator pesawat ruang angkasa,
mengembalikan 0 jika kedua operan sama, 1 jika kiri lebih besar, dan -1 jika kanan lebih besar
yang persis apa yang usort
dibutuhkan. Bahkan, hampir seluruh justifikasi yang diberikan untuk menambahkan <=>
bahasa di https://wiki.php.net/rfc/combined-comparison-operator adalah bahwa ia
membuat penulisan callback pemesanan untuk digunakan dengan usort()
lebih mudah
PHP 5.3+
PHP 5.3 memperkenalkan fungsi anonim, tetapi belum memiliki operator pesawat ruang angkasa. Kita masih bisa menggunakan usort
untuk mengurutkan array kita, tetapi sedikit lebih verbose dan lebih sulit untuk dipahami:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Perhatikan bahwa meskipun cukup umum untuk pembanding yang berurusan dengan nilai integer untuk hanya mengembalikan perbedaan nilai, seperti $item2['price'] - $item1['price']
, kami tidak dapat melakukannya dengan aman dalam kasus ini. Ini karena harga adalah angka floating point dalam contoh penanya pertanyaan, tetapi fungsi perbandingan yang kami berikan usort
harus mengembalikan bilangan bulat usort
agar berfungsi dengan benar:
Mengembalikan nilai non-integer dari fungsi perbandingan, seperti float, akan menghasilkan gips internal ke integer dari nilai pengembalian callback. Jadi nilai-nilai seperti 0,99 dan 0,1 keduanya akan dilemparkan ke nilai integer 0, yang akan membandingkan nilai-nilai tersebut sebagai sama.
Ini adalah jebakan penting yang harus diingat ketika menggunakan usort
di PHP 5.x! Versi asli saya dari jawaban ini membuat kesalahan ini, namun saya mendapatkan sepuluh upvotes lebih dari ribuan tampilan rupanya tanpa ada yang memperhatikan bug serius. Kemudahan yang lackwits seperti saya dapat mengacaukan fungsi komparator adalah justru alasan bahwa operator pesawat ruang angkasa lebih mudah digunakan telah ditambahkan ke bahasa dalam PHP 7.