Diberikan array ini:
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
Saya ingin mengurutkan $inventory
elemen berdasarkan harga untuk mendapatkan:
$inventory = array(
array("type"=>"pork", "price"=>5.43),
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
);
Bagaimana saya bisa melakukan ini?
Jawaban:
Anda benar, fungsi yang Anda cari adalah
array_multisort()
.Berikut ini contoh yang diambil langsung dari manual dan disesuaikan dengan kasus Anda:
sumber
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:
Atau jenis menurun seperti ini:
Untuk memahami cara kerjanya, perhatikan bahwa
usort
mengambil fungsi perbandingan yang disediakan pengguna yang harus berperilaku sebagai berikut (dari dokumen):Dan perhatikan juga bahwa
<=>
, operator pesawat ruang angkasa,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 iaPHP 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: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 berikanusort
harus mengembalikan bilangan bulatusort
agar berfungsi dengan benar: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.sumber
uasort
. Namun, setelah melihat dokumen, jawaban ini masih benar dalam kasus ini . Dalam contoh OP, array yang akan diurutkan memiliki indeks numerik berurutan daripada indeks string, jadiusort
lebih tepat. Menggunakanuasort
pada array berindeks berurutan akan menghasilkan array yang diurutkan yang tidak dipesan oleh indeks numeriknya, sehingga elemen pertama yang terlihat dalam satuforeach
lingkaran tidak$your_array[0]
, yang tidak mungkin merupakan perilaku yang diinginkan.Sementara yang lain dengan tepat menyarankan penggunaan
array_multisort()
, untuk beberapa alasan tidak ada jawaban yang mengakui keberadaanarray_column()
, yang dapat sangat menyederhanakan solusi. Jadi saran saya adalah:sumber
Karena elemen array Anda adalah array sendiri dengan kunci string, taruhan terbaik Anda adalah dengan menentukan fungsi perbandingan kustom. Ini cukup cepat dan mudah dilakukan. Coba ini:
Menghasilkan yang berikut:
sumber
uasort( $inventory, function ($a, $b) { if ( $a==$b ) return 0; else return ($a > $b) ? -1 : 1; });
usort
tampaknya lebih tepat daripadauasort
menyortir array dengan kunci numerik berurutan. Mengakhiri array di mana elemen pertama berada di indeks1
dan elemen kedua di indeks0
adalah perilaku aneh dan perangkap yang pasti bagi orang-orang yang tidak terbiasa dengan rincian array PHP;usort
memberi Anda output yang Anda harapkan secara intuitif.Saya mengakhiri ini:
Panggil saja fungsinya, meneruskan larik dan nama bidang larik tingkat kedua. Suka:
sumber
Anda dapat menggunakan
usort
dengan fungsi anonim, missumber
strnatcmp
, dimaksudkan untuk membandingkan string, tampaknya berfungsi dengan baik di sini. Rupanya "tatanan alam" yang diterapkannya mencakup penyortiran string numerik secara numerik daripada leksikal.output:
sumber
Dari Urutkan array array asosiatif dengan nilai kunci yang diberikan dalam php :
uasort ( http://php.net/uasort ) memungkinkan Anda untuk mengurutkan array berdasarkan fungsi yang Anda tentukan sendiri. Dalam kasus Anda, itu sederhana:
sumber
cmp
fungsi di sini adalah salah. Seharusnya mengembalikan "integer 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" tetapi sebaliknya mengembalikantrue
ataufalse
. Tampaknya, sangat, untuk pekerjaan - mungkin karena implementasi saat iniusort
dan teman memperlakukan "kurang dari" dan "sama dengan" kasus identik - tetapi tidak mengandalkan itu melanjutkan bekerja di versi PHP masa depan. Jika mereka mencoba membuat sort menjadi stabil (yaitu tidak bergerak dengan elemen yang sama tidak perlu), ini akan pecah.usort
akan lebih tepat daripada diuasort
sini, karenauasort
mempertahankan hubungan antara kunci dan nilai-nilai yang membingungkan dan tak terduga ketika berkerja dengan array numerik berurutan. Misalnya, indeks di$array
atas setelah panggilanuasort
adalah 2, 0, dan 1, dalam urutan itu. Kecuali Anda karena suatu alasan menginginkannya, Anda mungkin akan lebih nyaman menggunakanusort
, yang mengindeks ulang array serta menata ulang itu.Diuji pada 100.000 catatan: Waktu dalam detik (dihitung dengan funciton microtime). Hanya untuk nilai unik pada penyortiran posisi kunci.
Solusi fungsi @Josh Davis: Waktu yang dihabiskan: 1.5768740177155
Solusi tambang: Waktu yang dihabiskan: 0,094044923782349
Larutan:
sumber
Saya menggunakan
uasort
seperti inisumber
Fungsi ini dapat digunakan kembali:
Ini berfungsi dengan baik pada nilai string secara default, tetapi Anda harus melakukan panggilan balik untuk fungsi perbandingan angka jika semua nilai Anda adalah angka.
sumber
usortarr
tetapi kemudian meneleponuasort
bukannyausort
; mungkin agak membingungkan. Yang terakhir adalah - dalam kasus array berurutan dengan indeks numerik, seperti yang diperlihatkan dalam pertanyaan - mungkin apa yang sebenarnya Anda inginkan.Anda mungkin mencoba mendefinisikan fungsi perbandingan Anda sendiri dan kemudian menggunakan usort .
sumber
Berikut adalah metode yang saya temukan sejak lama dan sedikit dibersihkan. Ini berfungsi dengan baik, dan dapat dengan cepat diubah untuk menerima objek juga.
untuk mengubah metode untuk mengurutkan objek cukup ubah baris berikut:
$tempArray[] = strtolower( $value[ $sortByKey ] );
untuk$tempArray[] = strtolower( $value->$sortByKey );
Untuk menjalankan metode ini cukup lakukan
sortArray($inventory,'price','ASC');
sumber
array_multisort
) atau punyaku (denganusort
) dan tampaknya tidak menawarkan keuntungan dibandingkan dengan mereka sebagai gantinya.sumber
coba ini:
sumber
Lengkap Fungsi Dinamis Saya melompat di sini untuk mengurutkan array asosiatif dan menemukan fungsi luar biasa ini di http://php.net/manual/en/function.sort.php . Fungsi ini sangat dinamis yang mengurutkan dalam urutan naik dan turun dengan kunci yang ditentukan.
Fungsi sederhana untuk mengurutkan array dengan kunci tertentu. Mempertahankan hubungan indeks
sumber
sumber
coba ini:
untuk referensi lihat ini: http://php.net/manual/en/function.asort.php
lihat berbagai macam sortir di sini: http://www.php.net/manual/en/function.sort.php
sumber