Bagaimana saya bisa mengurutkan array objek ini dengan salah satu bidangnya, suka name
atau count
?
Array
(
[0] => stdClass Object
(
[ID] => 1
[name] => Mary Jane
[count] => 420
)
[1] => stdClass Object
(
[ID] => 2
[name] => Johnny
[count] => 234
)
[2] => stdClass Object
(
[ID] => 3
[name] => Kathy
[count] => 4354
)
....
Inilah cara yang lebih baik menggunakan penutupan
Harap dicatat ini tidak ada dalam dokumentasi PHP tetapi jika Anda menggunakan penutupan 5.3+ didukung di mana argumen yang bisa dipanggil dapat diberikan.
sumber
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
tetapi fungsi perbandingannya sama. Dengan menggunakan ini Anda harus menduplikasi kode untuk penutupan daripada melakukan panggilan keprotected static
metode yang Anda perlu mendefinisikan hanya sekali di kelas induk.Jika Anda ingin mengurutkan nilai integer:
DIPERBARUI dengan string, jangan lupa untuk mengonversi ke register yang sama (atas atau bawah)
sumber
jika Anda menggunakan php oop, Anda mungkin perlu mengubah ke:
sumber
Kode yang sama akan dengan
count
bidang.Lebih detail tentang
usort
: http://ru2.php.net/usortBtw, dari mana Anda mendapatkan array itu? Saya harap itu bukan dari database?
sumber
$result
akan berisiTRUE
jika berhasil, dan perbandingan Anda seharusnya$a->name > $b->name
. :)ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
tapi saya tidak bisa membuatnya bekerja :( Saya mendapatkan beberapa pemberitahuan dan memperingatkan bahwa usort mengharapkan parameter 2 menjadi panggilan balik yang validAnda dapat menggunakan fungsi ini (berfungsi dalam Versi PHP> = 5.3):
Contoh:
sumber
$a->{$key}
dan$b->{$key}
bukannya$a[$key]
dan$b[$key]
seperti kita, sebenarnya, berurusan dengan properti daripada anggota array, tapi ini masih jawaban yang saya cari.Anda dapat menggunakan
usort
, seperti ini:sumber
Jika semuanya gagal di sini adalah solusi lain:
sumber
Kelemahan dari semua jawaban di sini adalah bahwa mereka menggunakan nama bidang statis , jadi saya menulis versi yang disesuaikan dalam gaya OOP. Diasumsikan Anda menggunakan metode pengambil Anda bisa langsung menggunakan Kelas ini dan menggunakan nama bidang sebagai parameter . Mungkin seseorang menganggapnya berguna.
sumber
jika Anda ingin mengurutkan tanggal
sumber
Alternatif sederhana yang memungkinkan Anda menentukan secara dinamis bidang tempat penyortiran didasarkan:
Ini didasarkan pada kelas Penutupan , yang memungkinkan fungsi anonim. Ini tersedia sejak PHP 5.3.
sumber
Jika Anda membutuhkan lokal perbandingan string berdasarkan, Anda dapat menggunakan
strcoll
bukanstrcmp
.Ingat untuk pertama kali menggunakan
setlocale
denganLC_COLLATE
mengatur informasi lokal jika diperlukan.sumber
Jika Anda menggunakan ini di dalam Codeigniter, Anda dapat menggunakan metode:
@ rmooney terima kasih atas sarannya. Ini sangat membantu saya.
sumber
Terima kasih atas inspirasinya, saya juga harus menambahkan parameter $ translator eksternal
sumber
Jika Anda perlu mengurutkan berdasarkan satu bidang, maka itu
usort
adalah pilihan yang baik. Namun, solusinya dengan cepat menjadi berantakan jika Anda perlu mengurutkan berdasarkan beberapa bidang. Dalam hal ini, pustaka YaLinqo * dapat digunakan, yang mengimplementasikan sintaks query seperti SQL untuk array dan objek. Ini memiliki sintaks yang bagus untuk semua kasus:Di sini,
'$v->count'
adalah singkatan untukfunction ($v) { return $v->count; }
(keduanya dapat digunakan). Rantai metode ini mengembalikan iterator, tetapi Anda bisa mendapatkan array dengan menambahkan->toArray()
pada akhirnya jika Anda membutuhkannya.* Dikembangkan oleh saya
sumber
Anda dapat menggunakan fungsi yang diurutkan dari Nspl :
sumber
Inilah yang saya miliki untuk kelas utilitas
Sebut saja:
sumber
Anda dapat menggunakan usort seperti ini
Jika Anda ingin mengurutkan berdasarkan nomor:
Atau Abc char:
Lihat lebih lanjut: https://www.php.net/manual/en/function.usort.php
sumber