Soalan ini bertujuan sebagai rujukan berkenaan isu pengisihan tatasusunan dalam PHP. Mudah untuk berfikir bahawa kes khusus anda adalah unik dan patut ditanya soalan baharu, tetapi kebanyakannya sebenarnya hanyalah variasi kecil pada salah satu penyelesaian di halaman ini.
Jika soalan anda telah ditutup sebagai pendua soalan ini, sila hanya minta untuk membuka semula soalan anda jika anda boleh menerangkan sebab ia berbeza dengan ketara daripada semua soalan di bawah.
Bagaimana untuk mengisih tatasusunan dalam PHP?
Bagaimana untuk mengisih tatasusunan kompleks dalam PHP?
Bagaimana untuk mengisih pelbagai objek dalam PHP?
Asas tatasusunan satu dimensi; Tatasusunan berbilang dimensi, termasuk. Susunan objek termasuk. Isih satu tatasusunan berdasarkan tatasusunan yang lain
Gunakan pengisihan SPL
Isih stabil
Untuk jawapan praktikal menggunakan fungsi PHP sedia ada, lihat 1., dan untuk jawapan terperinci secara akademik tentang algoritma pengisihan (yang fungsi PHP laksanakan dan yang anda mungkin perlukan dalam kes yang sangat, sangat kompleks), lihat 2.
Baiklah, decezetelah merangkumi kebanyakan kaedah asas, saya akan cuba lihat jenis pengisihan yang lain
Isih menggunakan SPL
SplHeap
Output
SplMaxHeap
Kelas SplMaxHeap menyediakan fungsi utama timbunan, mengekalkan nilai maksimum di bahagian atas.
SplMinHeap
Jenis pengisihan lain
Isih gelembung
Dipetik daripadaArtikel Wikipedia tentang jenis gelembung:
Tatasusunan asas satu dimensi
Fungsi pengisihan yang berkenaan:
排序
排序
分类
排序
natsort
natcasesort
ksort
krsort
Satu-satunya perbezaan antara mereka ialah sama ada untuk mengekalkan perkaitan nilai kunci ("
a
”函数),是否按从低到高排序或反向排序(“r
” >”),是否对值或键进行排序(“k
”)以及如何比较值(“nat
" berbanding biasa). Lihat http://php.net/manual/en/array.sorting.php untuk mendapatkan gambaran keseluruhan dan pautan kepada butiran lanjut.Tatasusunan berbilang dimensi, termasuk tatasusunan objek
Jika anda ingin menekan kekunci setiap pasangan "foo" entri
$array
进行排序,则需要一个自定义比较函数。上面的sort
dan fungsi yang berkaitan berfungsi pada nilai mudah yang mereka tahu cara membandingkan dan mengisih. PHP tidak hanya "tahu" cara mengendalikan nilai kompleks seperti array('foo' => 'bar', 'baz' => 42);Untuk melakukan ini, anda perlu mencipta fungsi perbandingan. Fungsi ini menerima dua elemen dan jika elemen dianggap sama, ia mesti kembali
0
;如果第一个值较低,则必须返回低于0
的值;如果认为第一个值低于0,则必须返回高于
0 的值
jika nilai pertama lebih tinggi. Ini sahaja yang diperlukan:Lazimnya, anda perlu menggunakan fungsi tanpa nama sebagai panggilan balik. Jika anda ingin menggunakan kaedah atau kaedah statik, lihat Cara Lain untuk Menentukan Panggilan Balik dalam PHP.
Kemudian anda boleh menggunakan salah satu fungsi berikut:
usort
uasort
uksort
Sekali lagi, ia hanya berbeza sama ada persatuan nilai kunci dipelihara dan sama ada ia diisih mengikut nilai atau kunci. Sila baca dokumentasi mereka untuk mendapatkan butiran.
Contoh penggunaan:
usort
将从数组中取出两项并用它们调用您的cmp
函数。因此cmp()
将以$a
的形式调用array('foo' => 'bar', 'baz' => 42)
和$b
作为另一个array('foo' => ..., 'baz' => ...)
。然后该函数返回到usort
哪个值更大或者它们是否相等。usort
重复此过程,为$a
和$b
传递不同的值,直到数组排序完毕。cmp
函数将被调用多次,至少与$array
中的值一样多,并且值的不同组合每次代码>$a和$b
.Untuk membiasakan diri dengan idea ini, cuba yang berikut:
Apa yang anda lakukan ialah menentukan cara tersuai untuk membandingkan dua item dan itu sahaja yang anda perlukan. Ini berfungsi untuk pelbagai nilai.
Dengan cara ini, ini berfungsi dengan mana-mana nilai, yang tidak semestinya tatasusunan yang kompleks. Anda juga boleh membandingkan tatasusunan nombor mudah jika anda ingin melakukan perbandingan tersuai.
sort
Isih mengikut rujukan tidak akan mengembalikan apa-apa yang berguna!Perhatikan bahawa tatasusunan diisih di tempat, anda tidak perlu memberikan nilai pulangan kepada apa-apa.
$array = sort($array)
会将数组替换为true
,而不是排序后的数组。只需sort($array);
Itu sahaja.Perbandingan nombor tersuai
Jika anda ingin mengisih mengikut kekunci nombor
baz
, apa yang perlu anda lakukan ialah:Berkat kuasa math, ini akan mengembalikan nilai 0, bergantung pada
$a
是否小于、等于或大于$b
.Perhatikan bahawa ini adalah benar untuk
float
值不起作用,因为它们会被简化为int
并失去精度。请改用显式-1
、0
和1
nilai pulangan.Objek
Jika anda mempunyai pelbagai objek, ia berfungsi dengan cara yang sama:
Fungsi
Anda boleh melakukan apa sahaja yang anda perlukan dalam fungsi perbandingan, termasuk fungsi panggilan:
String
Pintasan untuk versi perbandingan rentetan pertama:
strcmp
完全符合cmp
的预期,它返回-1
、0
或1
.Operator Kapal Angkasa
PHP 7 memperkenalkan pengendali kapal angkasa, yang menyatukan dan memudahkan sama/kurang daripada/lebih besar daripada perbandingan merentas jenis: p>
Isih mengikut berbilang medan
Jika anda mahu mengisih terutamanya mengikut
foo
, tetapi jika dua elemen'foo
adalah sama, kemudian mengisih mengikutfoo
排序,但如果两个元素的foo
相等,则按baz
:Bagi mereka yang biasa, ini bersamaan dengan pertanyaan SQL menggunakan
ORDER BY foo, baz
.Lihat juga versi trengkas yang sangat ringkas inidan cara mencipta fungsi perbandingan sedemikian secara dinamik untuk sebarang bilangan kunci.
Isih mengikut susunan statik manual
Jika anda ingin mengisih elemen ke dalam "pesanan manual" seperti "foo", "bar", "baz" :
Untuk semua perkara di atas, jika anda menggunakan PHP 5.3 atau lebih tinggi (dan anda benar-benar perlu), gunakan fungsi tanpa nama untuk memendekkan kod anda dan mengelakkan fungsi global yang lain:
Ini ialah cara mudah untuk mengisih tatasusunan berbilang dimensi yang kompleks. Sekali lagi, ajar PHP cara menentukan antara dua item yang "lebih besar" biarkan PHP melakukan pengisihan sebenar.
Selain itu, untuk semua perkara di atas, untuk menukar antara tertib menaik dan menurun, hanya tukar parameter
$a
和$b
. Contohnya:Isih satu tatasusunan berdasarkan tatasusunan yang lain
Terdapat juga yang mewah
array_multisort
yang membolehkan anda mengisih tatasusunan berdasarkan: Satu lagi:Hasil yang diharapkan di sini ialah:
Ke sana menggunakan
array_multisort
:Bermula dengan PHP 5.5.0, anda boleh menggunakan
array_column
untuk mengekstrak lajur daripada tatasusunan berbilang dimensi dan mengisih tatasusunan pada lajur itu:Anda juga boleh mengisih berbilang lajur dalam mana-mana arah:
Bermula dalam PHP 7.0.0, anda juga boleh mengekstrak sifat daripada pelbagai objek.