Apakah mungkin dalam PHP untuk melakukan hal seperti ini? Bagaimana Anda akan menulis fungsi? Berikut ini sebuah contoh. Urutan adalah hal yang paling penting.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
Dan saya ingin melakukan sesuatu seperti
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Karena pada akhirnya saya menggunakan foreach () dan mereka tidak dalam urutan yang benar (karena saya menambahkan nilai ke string yang harus dalam urutan yang benar dan saya tidak tahu sebelumnya semua kunci array / nilai).
Saya telah melihat melalui fungsi array internal PHP tetapi tampaknya Anda hanya dapat mengurutkan berdasarkan abjad atau angka.
Ini dia:
sumber
array_merge()
!usort()
atauuasort()
?break
pernyataan setelah nilai ditemukan.array_merge()
dengan+
operator array . Ini bergabung dengan kunci (juga untuk kunci numerik) dan dari kiri ke kanan , sementaraarray_merge
penggabungan dari kanan ke kiri dan tidak pernah menimpa kunci numerik. Misal[0,1,2]+[0,5,6,7] = [0,1,2,7]
sementaraarray_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]
dan['a' => 5] + ['a' => 7] = ['a' => 5]
tapiarray_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
.+
tanda?Bagaimana dengan solusi ini
sumber
O(n * log n)
, maka algoritma ini berjalanO(n^2 * log(n))
.Cara lain untuk PHP> = 5.3.0:
Hasil:
Berfungsi baik dengan string dan tombol angka.
sumber
array_replace()
untuk menyampaikan maksud lebih baik daripadaarray_merge()
.array_replace
juga meninggalkan tipe variabel utuh. Jika salah satu nilai dalam array Anda akan(string) '1'
dan Anda akan menggunakan+
operator, nilainya akan berubah menjadi(int) 1
array_merge()
hanya akan menambahkannya?). Logikanya dijelaskan dengan sangat baik di sini . Pertama ,array_flip()
ubah nilai array pesanan $ ke kunci. Kedua ,array_replace()
mengganti nilai-nilai array pertama dengan nilai-nilai yang memiliki kunci yang sama di array kedua. Jika Anda perlu mengurutkan array berdasarkan kunci dari yang lain, Anda bahkan tidak perlu menggunakannyaarray_flip
.sumber
Ambil satu larik sebagai pesanan Anda:
Anda dapat mengurutkan array lain berdasarkan nilai menggunakan
array_intersect
Documents :Atau dalam kasus Anda, untuk mengurutkan berdasarkan kunci, gunakan
array_intersect_key
Documents :Kedua fungsi akan menjaga urutan parameter pertama dan hanya akan mengembalikan nilai (atau kunci) dari array kedua.
Jadi untuk dua kasus standar ini Anda tidak perlu menulis fungsi sendiri untuk melakukan penyortiran / pengaturan ulang.
sumber
Saya menggunakan solusi Darkwaltz4 tetapi digunakan
array_fill_keys
sebagai penggantiarray_flip
, untuk mengisinya denganNULL
jika kunci tidak disetel$array
.sumber
Tanpa sihir ...
sumber
$dataset
untuk mencocokkan nama parameterJIKA Anda memiliki array dalam array Anda, Anda harus menyesuaikan fungsi dengan Eran sedikit ...
sumber
Fungsi ini mengembalikan sub dan array yang diurutkan berdasarkan parameter $ kunci kedua
Contoh:
sumber
PHP memiliki fungsi untuk membantu Anda dalam hal ini:
Usort melakukan semua pekerjaan untuk Anda dan array_search menyediakan kunci. array_search () mengembalikan false ketika tidak dapat menemukan kecocokan sehingga item yang tidak ada dalam susunan sortir secara alami pindah ke bagian bawah array.
Catatan: uasort () akan memesan array tanpa memengaruhi hubungan nilai kunci =>.
sumber
Kode:
sumber
Saran pertama
Saran kedua
Saya ingin menunjukkan bahwa kedua saran ini luar biasa. Namun, mereka adalah apel dan jeruk. Perbedaan? Satu ramah non-asosiatif dan yang lain ramah asosiatif. Jika Anda menggunakan 2 array asosiatif penuh maka array menggabungkan / membalik sebenarnya akan menggabungkan dan menimpa array asosiatif lainnya. Dalam kasus saya itu bukan hasil yang saya cari. Saya menggunakan file settings.ini untuk membuat susunan urutan pengurutan. Array data yang saya sortir tidak perlu ditulis oleh rekan sortasi asosiatif saya. Dengan demikian array gabungan akan menghancurkan array data saya. Keduanya adalah metode yang hebat, keduanya harus diarsipkan di kotak alat pengembang apa pun. Berdasarkan kebutuhan Anda, Anda mungkin benar-benar membutuhkan kedua konsep di arsip Anda.
sumber
Saya mengadopsi jawaban dari @ Darkwaltz4 untuk singkatnya dan ingin berbagi bagaimana saya mengadaptasi solusi untuk situasi di mana array dapat berisi kunci yang berbeda untuk setiap iterasi seperti:
dan mempertahankan "kunci utama" seperti:
array_merge akan mengeksekusi penggabungan dalam iterasi Array [1] berdasarkan $ master_key dan menghasilkan ['some_key'] = '', nilai kosong, untuk iterasi itu. Karenanya, array_intersect_key digunakan untuk memodifikasi $ master_key di setiap iterasi seperti:
sumber
Sedikit terlambat, tetapi saya tidak dapat menemukan cara saya mengimplementasikannya, versi ini perlu ditutup, php> = 5.3, tetapi dapat diubah tidak menjadi:
Tentu saja 'dontSortMe' perlu disortir, dan dapat muncul pertama kali dalam contoh
sumber