Pertanyaan ini dimaksudkan sebagai referensi untuk pertanyaan tentang menyortir array dalam PHP. Mudah untuk berpikir bahwa kasus khusus Anda unik dan layak untuk sebuah pertanyaan baru, tetapi sebagian besar sebenarnya merupakan variasi kecil dari salah satu solusi di halaman ini.
Jika pertanyaan Anda ditutup sebagai duplikat dari pertanyaan ini, harap minta pertanyaan Anda dibuka kembali hanya jika Anda dapat menjelaskan mengapa pertanyaan itu sangat berbeda dari semua yang di bawah ini.
Bagaimana cara saya mengurutkan array dalam PHP?
Bagaimana cara saya mengurutkan array yang rumit di PHP?
Bagaimana cara saya mengurutkan array objek di PHP?
Untuk jawaban praktis menggunakan fungsi PHP yang ada, lihat 1., untuk jawaban mendetail akademik tentang algoritme pengurutan (fungsi PHP yang diterapkan dan yang mungkin Anda perlukan untuk kasus yang benar-benar rumit), lihat 2.
Jawaban:
Array satu dimensi dasar
Fungsi pengurutan yang berlaku:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
Perbedaan antara keduanya hanyalah apakah asosiasi nilai kunci dipertahankan ("
a
" fungsi), apakah itu mengurutkan rendah ke tinggi atau terbalik ("r
"), apakah itu mengurutkan nilai atau kunci ("k
") dan bagaimana ia membandingkan nilai-nilai ("nat
" vs normal). Lihat http://php.net/manual/en/array.sorting.php untuk ikhtisar dan tautan ke detail lebih lanjut.Array multi dimensi, termasuk array benda
Jika Anda ingin mengurutkan
$array
berdasarkan 'foo' kunci dari setiap entri, Anda memerlukan fungsi perbandingan khusus .sort
Fungsi-fungsi di atas dan terkait bekerja pada nilai-nilai sederhana yang mereka tahu bagaimana membandingkan dan mengurutkan. PHP tidak hanya "tahu" apa yang harus dilakukan dengan nilai kompleks sepertiarray('foo' => 'bar', 'baz' => 42)
; jadi kamu harus mengatakannya.Untuk melakukan itu, Anda perlu membuat fungsi perbandingan . Fungsi itu mengambil dua elemen dan harus kembali
0
jika elemen-elemen ini dianggap sama, nilai lebih rendah dari0
jika nilai pertama lebih rendah dan nilai lebih tinggi daripada0
jika nilai pertama lebih tinggi. Hanya itu yang dibutuhkan:Seringkali, Anda ingin menggunakan fungsi anonim sebagai panggilan balik. Jika Anda ingin menggunakan metode atau metode statis, lihat cara lain untuk menentukan panggilan balik dalam PHP .
Anda kemudian menggunakan salah satu dari fungsi-fungsi ini:
usort
uasort
uksort
Sekali lagi, mereka hanya berbeda dalam apakah mereka menyimpan asosiasi nilai kunci dan mengurutkan berdasarkan nilai atau kunci. Baca dokumentasi mereka untuk detailnya.
Contoh penggunaan:
usort
akan mengambil dua item dari array dan memanggilcmp
fungsi Anda dengannya. Jadicmp()
akan dipanggil dengan$a
sebagaiarray('foo' => 'bar', 'baz' => 42)
dan$b
sebagai yang lainarray('foo' => ..., 'baz' => ...)
. Fungsi kemudian kembali keusort
nilai mana yang lebih besar atau apakah mereka sama.usort
mengulangi proses ini melewati nilai yang berbeda untuk$a
dan$b
sampai array diurutkan. Thecmp
fungsi akan dipanggil berkali-kali, setidaknya sebanyak yang ada nilai-nilai dalam$array
, dengan kombinasi yang berbeda dari nilai-nilai untuk$a
dan$b
setiap waktu.Untuk terbiasa dengan ide ini, coba ini:
Yang Anda lakukan hanyalah menentukan cara kustom untuk membandingkan dua item, hanya itu yang Anda butuhkan. Itu bekerja dengan segala macam nilai.
By the way, ini bekerja pada nilai apa pun, nilai tidak harus menjadi array yang kompleks. Jika Anda memiliki perbandingan ubahsuaian yang ingin Anda lakukan, Anda juga dapat melakukannya pada array angka sederhana.
sort
macam dengan referensi dan tidak mengembalikan apa pun yang berguna!Perhatikan bahwa array ada di tempat , Anda tidak perlu menetapkan nilai kembali untuk apa pun.
$array = sort($array)
akan mengganti array dengantrue
, bukan dengan array yang diurutkan. Hanyasort($array);
bekerja.Perbandingan angka khusus
Jika Anda ingin mengurutkan berdasarkan
baz
kunci, yang berupa angka, yang perlu Anda lakukan adalah:Berkat The PoWEr of MATH ini mengembalikan nilai <0, 0 atau> 0 tergantung pada apakah
$a
lebih rendah dari, sama dengan atau lebih besar dari$b
.Perhatikan bahwa ini tidak akan berfungsi dengan baik untuk
float
nilai, karena nilai tersebut akan dikurangi menjadiint
dan kehilangan presisi. Gunakan eksplisit-1
,0
dan1
kembalikan nilai.Benda
Jika Anda memiliki array objek, ia bekerja dengan cara yang sama:
Fungsi
Anda dapat melakukan apa pun yang Anda butuhkan di dalam fungsi perbandingan, termasuk fungsi panggilan:
String
Pintasan untuk versi perbandingan string pertama:
strcmp
tidak persis apa yang diharapkan daricmp
sini, mengembalikan-1
,0
atau1
.Operator pesawat ruang angkasa
PHP 7 memperkenalkan operator pesawat ruang angkasa , yang menyatukan dan menyederhanakan sama / lebih kecil / lebih besar dari perbandingan antar jenis:
Menyortir berdasarkan beberapa bidang
Jika Anda ingin mengurutkan berdasarkan
foo
, tetapi jikafoo
sama untuk dua elemen, urutkan berdasarkanbaz
:Bagi yang terbiasa, ini setara dengan permintaan SQL dengan
ORDER BY foo, baz
.Juga lihat versi steno yang sangat rapi ini dan cara membuat fungsi pembanding secara dinamis untuk sejumlah kunci yang berubah-ubah .
Menyortir ke dalam urutan manual, statis
Jika Anda ingin mengurutkan elemen menjadi "urutan manual" seperti "foo", "bar", "baz" :
Untuk semua hal di atas, jika Anda menggunakan PHP 5.3 atau lebih tinggi (dan memang harus demikian), gunakan fungsi anonim untuk kode yang lebih pendek dan untuk menghindari ada fungsi global lain yang beredar:
Begitulah cara sederhana menyortir array multi dimensi yang kompleks. Sekali lagi, pikirkan saja dalam hal mengajar PHP bagaimana cara membedakan mana dari dua item yang "lebih besar" ; biarkan PHP melakukan penyortiran yang sebenarnya.
Juga untuk semua hal di atas, untuk beralih antara urutan naik dan turun cukup menukar
$a
dan$b
argumen di sekitar. Misalnya:Mengurutkan satu array berdasarkan yang lain
Dan kemudian ada yang aneh
array_multisort
, yang memungkinkan Anda mengurutkan satu array berdasarkan yang lain:Hasil yang diharapkan di sini adalah:
Gunakan
array_multisort
untuk sampai ke sana:Pada PHP 5.5.0 Anda dapat menggunakan
array_column
untuk mengekstrak kolom dari array multi dimensi dan mengurutkan array pada kolom itu:Pada PHP 7.0.0 Anda juga dapat mengekstrak properti dari berbagai objek.
sumber
array_flip()
untuk menggunakan pencarian posisi lebih cepat, misalnya$order[$a['foo']]
bukanarray_search($a['foo'], $order)
.Yah sebagian besar metode dasar sudah tercakup oleh tipuan saya akan mencoba untuk melihat jenis penyortiran lainnya
Mengurutkan dengan SPL
SplHeap
Keluaran
SplMaxHeap
Kelas SplMaxHeap menyediakan fungsi utama heap, menjaga maksimum di atas.
SplMinHeap
Jenis Penyortiran Lainnya
Sortir Bubble
Dari artikel Wikipedia tentang Bubble Sort:
Sortir seleksi
Dari artikel Wikipedia tentang Seleksi:
Jenis penyisipan
Dari artikel Wikipedia tentang penyisipan:
Shellsort
Dari artikel Wikipedia tentang Shellsort:
Semacam sisir
Dari artikel Wikipedia tentang jenis Sisir:
Gabungkan semacam
Dari artikel Wikipedia di Gabung urut:
Quicksort
Dari artikel Wikipedia di Quicksort:
Jenis permutasi
Dari artikel Wikipedia tentang jenis Permutasi:
Jenis radix
Dari artikel Wikipedia tentang Radix sort:
sumber
O(n^2)
perbandingan jika kita akan menggunakan elemen pertama sebagai pivot)Semacam stabil
Katakanlah Anda memiliki array seperti ini:
Dan sekarang Anda ingin mengurutkan hanya pada huruf pertama:
Hasilnya adalah ini:
Semacam itu tidak stabil!
Pengamat yang tajam mungkin telah memperhatikan bahwa algoritma pengurutan array (QuickSort) tidak menghasilkan hasil yang stabil dan bahwa urutan asli antara kata-kata dari huruf pertama yang sama tidak dipertahankan. Kasing ini sepele dan kami harus membandingkan seluruh string, tetapi anggap saja kasing Anda lebih rumit, seperti dua jenis berturut-turut pada bidang berbeda yang tidak boleh membatalkan pekerjaan masing-masing.
Transformasi Schwartzian
Transformasi Schwartzian , juga disebut sebagai idiom menghias-sort-undecorate, memberikan efek jenis stabil dengan algoritma penyortiran yang secara inheren tidak stabil.
Pertama, Anda menghias setiap elemen array dengan array lain yang terdiri dari kunci primer (nilai) dan kunci sekunder (indeks atau posisinya):
Ini mengubah array menjadi ini:
Sekarang, kami menyesuaikan langkah perbandingan; kami membandingkan huruf pertama lagi, tetapi jika itu sama, kunci sekunder digunakan untuk mempertahankan pemesanan asli:
Setelah itu, kami membatalkan dekorasinya:
Hasil akhir:
Bagaimana dengan penggunaan kembali?
Anda harus menulis ulang fungsi perbandingan untuk bekerja dengan elemen array yang diubah; Anda mungkin tidak ingin mengedit fungsi perbandingan halus Anda, jadi inilah bungkus untuk fungsi perbandingan:
Mari kita menulis langkah penyortiran menggunakan fungsi ini:
Voila! Kode perbandingan asli Anda kembali.
sumber
Pada PHP 5.3 dengan penutupan juga dimungkinkan untuk menggunakan penutupan untuk menentukan urutan jenis Anda.
Misalnya dengan asumsi $ array adalah array objek yang berisi properti bulan.
sumber
LINQ
Dalam .NET, LINQ sering digunakan untuk menyortir, yang menyediakan sintaks yang jauh lebih baik daripada fungsi perbandingan, terutama ketika objek perlu diurutkan berdasarkan beberapa bidang. Sudah ada beberapa port LINQ ke PHP, termasuk perpustakaan YaLinqo *. Dengan itu, array dapat diurutkan dengan satu baris tanpa menulis fungsi perbandingan yang kompleks.
Perbandingan dapat dikustomisasi lebih lanjut dengan meneruskan panggilan balik sebagai argumen kedua, misalnya:
Di sini,
'$v->count'
adalah singkatan untukfunction ($v) { return $v->count; }
(keduanya dapat digunakan). Rantai metode ini mengembalikan iterator, iterator dapat diubah menjadi array dengan menambahkan->toArray()
pada akhirnya jika diperlukan.Internal,
orderBy
dan metode terkait memanggil berbagai pemilahan fungsi yang sesuai (uasort
,krsort
,multisort
,usort
dll).LINQ berisi lebih banyak metode yang terinspirasi oleh SQL: pemfilteran, pengelompokan, penggabungan, penjumlahan, dll. Ini paling cocok untuk kasus-kasus ketika transformasi kompleks pada array dan objek perlu dilakukan tanpa bergantung pada database.
* Dikembangkan oleh saya, lihat readme untuk detail lebih lanjut dan perbandingan dengan port LINQ lainnya
sumber
Urutkan multidimensi berdasarkan nilai kunci
Semacam alami array multidimensi dengan nilai kunci dan juga menjaga urutan asli (jangan mengocok kunci utama):
Kasus cobaan:
sumber
Sangat mudah untuk mengurutkan array dengan fungsi yang diurutkan dari Nspl :
Penyortiran dasar
Mengurutkan berdasarkan hasil fungsi
Mengurutkan array multidimensi
Menyortir berbagai objek
Menyortir dengan fungsi perbandingan
Anda dapat melihat semua contoh ini di sini .
sumber
Jika Anda ingin memesan berdasarkan nilai kunci, maka Anda dapat melakukannya satu baris, elegan dan jelas. Ini akan dipesan dengan harga naik. Menggunakan array_multisort dan array_column.
untuk menghasilkan
sumber
Halaman ini sangat komprehensif, tetapi saya ingin menambahkan sedikit lebih banyak tentang utilitas luar biasa dari operator pesawat ruang angkasa (operator perbandingan tiga arah) - anak yang cantik dari PHP7 +.
Menggunakan operator pesawat ruang angkasa untuk menerapkan beberapa kondisi penyortiran
Ini membuat langkah besar dalam mengurangi mengasapi kode dan meningkatkan keterbacaan.
Saat menulis fungsi penyortiran khusus Anda (
usort()
/uasort()
/uksort()
) untuk memproses beberapa kondisi, Anda hanya perlu menulis array yang seimbang di kedua sisi operator dan mengembalikan hasilnya. Tidak ada lagi blok kondisi bersarang atau beberapa pengembalian.Elemen-elemen dari kedua sisi operator akan dilintasi dari kiri ke kanan, satu per satu, dan mengembalikan evaluasi segera setelah tidak ada ikatan atau ketika semua elemen telah dibandingkan.
Sampel data untuk demonstrasi saya:
Demonstrasi (untuk menghindari kembungnya halaman Stackoverflow, silakan lihat tautan demo untuk hasilnya):
Logika penyortiran:
mengapung ASC
Logika penyortiran:
boolean ASC
Logika penyortiran:
natString ASC
Sintaks ini memungkinkan Anda untuk mengurutkan nilai, hasil fungsional, data yang bersarang mendalam, dan arah penyortiran secara elegan. Ini jelas layak untuk dimasukkan ke dalam toolbelt php Anda ... untuk kasus-kasus ketika Anda memproses data non-basis data - karena tentu saja SQL akan menjadi teknik yang jauh lebih masuk akal.
Atas kebijakan Anda sendiri, dari PHP7.4 Anda dapat menggunakan sintaks panah dengan fungsi-fungsi anonim ini. Script yang sama dengan sintaks panah .
sumber
Jika seseorang menginginkan solusi yang lebih sederhana untuk memanipulasi array, cukup gunakan paket Laravel Collection yang memiliki fungsi sortBy yang diimplementasikan yang memungkinkan Anda mengurutkan berdasarkan kunci dengan mudah.
yaitu, untuk mengurutkan pertama dengan a, lalu b, lalu c, klausa yang benar adalah
https://packagist.org/packages/tightenco/collect
sumber
Ada beberapa cara untuk mengurutkan array. Saya akan menyebutkan beberapa metode untuk melakukan tugas itu. Pertama-tama, saya akan memberikan array integer yang disebut sebagai '$ number'.
Ini adalah cara normal untuk membuat array. Misalkan, saya ingin mengurutkan array dalam urutan menaik. Untuk itu, metode 'sort ()' dapat digunakan.
Sekarang perhatikan output dari itu,
Anda dapat melihat array angka yang dicetak diurutkan. Jika Anda ingin agar array angka menjadi semacam adalah urutan menurun, metode 'rsort ()' dapat digunakan untuk tugas itu.
pertimbangkan output ..
Sekarang array diurutkan dalam urutan menurun. Oke, Mari kita pertimbangkan array asosiatif. Saya akan memberikan array asosiatif (array Asosiatif berarti bahwa, sebuah array yang setiap indeksnya memiliki nilai kunci unik.) Seperti ini,
Jadi, Sekarang saya ingin mengurutkan array ini dalam urutan menaik menurut nilainya. Metode 'asort ()' dapat digunakan untuk itu.
Jika mengurutkan pesanan menurun sesuai nilainya, metode 'arsort ()' dapat digunakan. Misalkan Anda ingin mengurutkan array berdasarkan nilai kunci mereka. Dalam hal ini, metode 'ksort ()' dapat digunakan.
Sekarang perhatikan hasilnya.
Sekarang array diurutkan berdasarkan nilai kunci mereka. Jika Anda ingin mengurutkan array dalam urutan menurun sesuai dengan nilai kunci mereka, metode 'krsort ()' dapat digunakan.
Sekarang array asosiatif diurutkan dalam urutan menurut nilai kunci mereka. Lihatlah output.
Ini adalah beberapa metode untuk menyortir array dalam urutan naik atau turun di php. Saya harap Anda bisa mendapatkan ide. Terima kasih!
sumber
Yang paling sederhana adalah menggunakan fungsi usort untuk mengurutkan array tanpa pengulangan: Di bawah ini adalah contoh:
Ini akan mengurutkan dalam urutan menurun:
Ini akan mengurutkan dalam urutan naik:
sumber