Array satu dimensi dasar
$array = array(3, 5, 2, 8);
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
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
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 seperti array('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 dari 0
jika nilai pertama lebih rendah dan nilai lebih tinggi daripada 0
jika nilai pertama lebih tinggi. Hanya itu yang dibutuhkan:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
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:
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($array, 'cmp');
usort
akan mengambil dua item dari array dan memanggil cmp
fungsi Anda dengannya. Jadi cmp()
akan dipanggil dengan $a
sebagai array('foo' => 'bar', 'baz' => 42)
dan $b
sebagai yang lain array('foo' => ..., 'baz' => ...)
. Fungsi kemudian kembali ke usort
nilai mana yang lebih besar atau apakah mereka sama. usort
mengulangi proses ini melewati nilai yang berbeda untuk $a
dan $b
sampai array diurutkan. The cmp
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:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
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 dengan true
, bukan dengan array yang diurutkan. Hanya sort($array);
bekerja.
Perbandingan angka khusus
Jika Anda ingin mengurutkan berdasarkan baz
kunci, yang berupa angka, yang perlu Anda lakukan adalah:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
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 menjadi int
dan kehilangan presisi. Gunakan eksplisit -1
, 0
dan 1
kembalikan nilai.
Benda
Jika Anda memiliki array objek, ia bekerja dengan cara yang sama:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
Fungsi
Anda dapat melakukan apa pun yang Anda butuhkan di dalam fungsi perbandingan, termasuk fungsi panggilan:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
String
Pintasan untuk versi perbandingan string pertama:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
tidak persis apa yang diharapkan dari cmp
sini, mengembalikan -1
, 0
atau 1
.
Operator pesawat ruang angkasa
PHP 7 memperkenalkan operator pesawat ruang angkasa , yang menyatukan dan menyederhanakan sama / lebih kecil / lebih besar dari perbandingan antar jenis:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
Menyortir berdasarkan beberapa bidang
Jika Anda ingin mengurutkan berdasarkan foo
, tetapi jika foo
sama untuk dua elemen, urutkan berdasarkan baz
:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
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" :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
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:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
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:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
Mengurutkan satu array berdasarkan yang lain
Dan kemudian ada yang aneh array_multisort
, yang memungkinkan Anda mengurutkan satu array berdasarkan yang lain:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
Hasil yang diharapkan di sini adalah:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
Gunakan array_multisort
untuk sampai ke sana:
array_multisort($array1, $array2);
Pada PHP 5.5.0 Anda dapat menggunakan array_column
untuk mengekstrak kolom dari array multi dimensi dan mengurutkan array pada kolom itu:
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
Pada PHP 7.0.0 Anda juga dapat mengekstrak properti dari berbagai objek.
Jika Anda memiliki kasus yang lebih umum, silakan edit jawaban ini.