Lebih
Bagaimana cara Mengurutkan Array Multidimensi dalam PHP
Saya telah CSV data dimuat ke dalam sebuah array multidimensi. Dengan cara ini masing-masing "baris" adalah catatan dan masing-masing "kolom" berisi satu jenis data yang sama. Saya menggunakan fungsi di bawah ini untuk memuat file CSV.
function f_parse_csv($file, $longest, $delimiter)
{
$mdarray = array();
$file = fopen($file, "r");
while ($line = fgetcsv($file, $longest, $delimiter))
{
array_push($mdarray, $line);
}
fclose($file);
return $mdarray;
}
Aku harus mampu untuk menentukan kolom untuk mengurutkan sehingga menata kembali baris. Salah satu kolom yang berisi informasi tanggal dalam format Y-m-d H:i:s
dan aku ingin menjadi mampu memilah dengan tanggal terakhir menjadi baris pertama.
198
11
Memperkenalkan: yang sangat umum solusi untuk PHP 5.3+
I 'd ingin menambahkan saya sendiri solusi di sini, karena menawarkan fitur-fitur yang lain jawaban tidak.
Secara khusus, keuntungan dari solusi ini meliputi:
DateTime
contoh).usort
atauuasort
).array_multisort
: sementaraarray_multisort
lebih nyaman, hal ini tergantung pada menciptakan sebuah proyeksi dari semua input data sebelum sorting. Ini membutuhkan waktu dan memori, dan mungkin akan cukup mahal jika data set yang besar.Kode
Cara menggunakan
Seluruh bagian ini saya akan memberikan link yang semacam ini contoh data set:
Dasar-dasar
Fungsi
make_comparer
menerima sejumlah variabel argumen yang menentukan jenis dan mengembalikan fungsi yang anda diharapkan untuk digunakan sebagai argumen untukusort
atauuasort
.Yang paling sederhana menggunakan kasus ini untuk lulus dalam kunci yang anda 'd digunakan untuk membandingkan data item. Misalnya, untuk semacam
$data
olehnama
item yang anda akan lakukanMelihatnya dalam tindakan.
Kunci juga dapat menjadi nomor satu jika barang numerik array diindeks. Misalnya dalam pertanyaan, ini akan menjadi
Melihatnya dalam tindakan.
Beberapa jenis kolom
Anda dapat menentukan beberapa jenis kolom dengan melewatkan parameter tambahan untuk
make_comparer
. Misalnya, untuk mengurutkan berdasarkan "nomor" dan kemudian oleh-nol kolom:Melihatnya dalam tindakan.
Fitur canggih
Lebih banyak fitur canggih yang tersedia jika anda menentukan jenis kolom sebagai array bukan sebuah string sederhana. Array ini harus diindeks secara numerik, dan harus berisi barang-barang ini:
Let's melihat bagaimana kita dapat menggunakan fitur ini.
Urut terbalik
Untuk mengurutkan berdasarkan nama descending:
Melihatnya dalam tindakan.
Untuk mengurutkan berdasarkan jumlah menurun dan kemudian dengan nama turun:
Melihatnya dalam tindakan.
Custom proyeksi
Dalam beberapa skenario anda mungkin perlu untuk mengurutkan berdasarkan kolom dan nilai-nilai yang tidak meminjamkan baik untuk menyortir. "ulang tahun" kolom pada data sampel yang ditetapkan sesuai dengan deskripsi ini: itu tidak masuk akal untuk membandingkan ulang tahun sebagai string (karena misalnya "01/01/1980" sebelum "10/10/1970"). Dalam hal ini kami ingin untuk menentukan bagaimana untuk proyek data aktual dengan bentuk yang bisa dapat dibandingkan secara langsung dengan yang diinginkan semantik.
Proyeksi dapat ditetapkan sebagai jenis callable: seperti string, array, atau fungsi anonim. Proyeksi ini diasumsikan untuk menerima satu argumen dan kembali diproyeksikan bentuk.
Perlu dicatat bahwa sementara proyeksi mirip dengan custom perbandingan fungsi-fungsi yang digunakan dengan
usort
dan keluarga, mereka sederhana (anda hanya perlu untuk mengkonversi nilai satu sama lain) dan mengambil keuntungan dari semua fungsi yang sudah dipanggang kemake_comparer
.Let's mengurutkan data contoh set tanpa proyeksi dan lihat apa yang terjadi:
Melihatnya dalam tindakan.
Itu bukan hasil yang diinginkan. Tapi kita dapat menggunakan
date_create
sebagai proyeksi:Melihatnya dalam tindakan.
Ini adalah urutan yang benar yang kita inginkan.
Ada banyak hal yang proyeksi dapat mencapai. Misalnya, cara yang cepat untuk mendapatkan kasus-sensitif semacam ini adalah untuk menggunakan
strtolower
sebagai proyeksi.Yang mengatakan, saya juga harus menyebutkan bahwa itu's lebih baik untuk tidak menggunakan proyeksi jika anda set data yang besar: dalam hal itu akan menjadi jauh lebih cepat untuk memproyeksikan semua data anda secara manual ke depan dan kemudian mengurutkan tanpa menggunakan proyeksi, meskipun demikian akan perdagangan peningkatan penggunaan memori yang lebih cepat semacam kecepatan.
Akhirnya, di sini adalah contoh yang menggunakan semua fitur: pertama jenis dengan jumlah menurun, maka dengan ulang tahun ascending:
Melihatnya dalam tindakan.
Anda dapat menggunakan array_multisort()
Mencoba sesuatu seperti ini:
Untuk PHP >= 5.5.0 hanya mengekstrak kolom untuk mengurutkan berdasarkan. Tidak perlu untuk loop:
Dengan usort. Berikut ini's solusi yang umum, yang dapat anda gunakan untuk kolom yang berbeda:
Untuk mengurutkan berdasarkan kolom pertama:
Beberapa baris pengurutan menggunakan penutupan
Berikut ini's pendekatan lain menggunakan uasort() dan anonim fungsi callback (penutupan). I've digunakan fungsi itu secara teratur. PHP 5.3 diperlukan – tidak ada lagi ketergantungan!
Aku tahu itu's 2 tahun sejak pertanyaan ini diajukan dan dijawab, tapi di sini's fungsi lain yang macam array dua dimensi. Ia menerima sejumlah variabel argumen, yang memungkinkan anda untuk lulus di lebih dari satu key (yaitu kolom nama) untuk mengurutkan berdasarkan. PHP 5.3 diperlukan.
http://qaify.com/sort-an-array-of-associative-arrays-by-value-of-given-key-in-php/
"Usort" fungsi adalah jawaban anda. http://php.net/usort
Berikut ini adalah php4/php5 kelas yang akan memilah satu atau lebih bidang-bidang:
Sebelum aku bisa mendapatkan TableSorter kelas untuk menjalankan saya telah datang dengan fungsi yang didasarkan pada apa yang Shinhan telah disediakan.
Aku mencoba beberapa tempat array_multisort() dan usort() jawaban dan tidak satupun dari mereka bekerja untuk saya. Data hanya akan campur aduk dan kode terbaca. Berikut ini's cepat kotor solusi. PERINGATAN: Hanya gunakan ini jika anda're yakin nakal pembatas won't datang kembali untuk menghantui anda nanti!
Let's mengatakan setiap baris dalam array multi terlihat seperti: nama, stuff1, stuff2:
Perlu anda kembali hal-hal dalam urutan abjad?
Ya, itu's kotor. Tapi super mudah, tidak't membuat kepala anda meledak.
Saya lebih suka menggunakan array_multisort. Lihat dokumentasi di sini.