Saya memiliki array asosiatif dalam bentuk di key => value
mana kunci adalah nilai numerik, namun itu bukan nilai numerik berurutan. Kuncinya sebenarnya adalah nomor ID dan nilainya adalah hitungan. Ini bagus untuk sebagian besar contoh, namun saya ingin fungsi yang mendapatkan nama array yang dapat dibaca manusia dan menggunakannya untuk kuncinya, tanpa mengubah nilainya.
Saya tidak melihat fungsi yang melakukan ini, tapi saya berasumsi saya perlu memberikan kunci lama dan kunci baru (keduanya saya miliki) dan mengubah array. Apakah ada cara yang efisien untuk melakukan ini?
php
arrays
associative-array
Thomas Owens
sumber
sumber
Jawaban:
sumber
Cara Anda melakukan ini dan mempertahankan urutan array adalah dengan meletakkan kunci array ke dalam array yang terpisah, menemukan dan mengganti kunci dalam array itu dan kemudian menggabungkannya kembali dengan nilai-nilai.
Berikut adalah fungsi yang melakukan hal itu:
sumber
jika Anda
array
dibuat dari kueri basis data, Anda dapat mengubah kunci langsung darimysql
pernyataan:dari pada
gunakan sesuatu seperti:
sumber
Jawaban dari KernelM bagus, tetapi untuk menghindari masalah yang diangkat oleh Greg di komentar (kunci yang bertentangan), menggunakan array baru akan lebih aman
sumber
Anda bisa menggunakan array asosiatif kedua yang memetakan nama yang dapat dibaca manusia ke id. Itu juga akan memberikan hubungan Banyak ke 1. Kemudian lakukan sesuatu seperti ini:
sumber
Jika Anda ingin juga posisi kunci array baru sama dengan yang lama Anda dapat melakukan ini:
sumber
Jika array Anda bersifat rekursif, Anda dapat menggunakan fungsi ini: uji data ini:
di sini adalah fungsinya:
sumber
sumber
Saya suka solusi KernelM, tetapi saya membutuhkan sesuatu yang akan menangani potensi konflik kunci (di mana kunci baru mungkin cocok dengan kunci yang ada). Inilah yang saya pikirkan:
Anda kemudian dapat menggilir array seperti ini:
sumber
Berikut adalah fungsi pembantu untuk mencapainya:
cukup berdasarkan jawaban @KernelM .
Pemakaian:
Ini akan mengembalikan true pada penggantian nama yang sukses, jika tidak palsu .
sumber
Hal yang mudah:
fungsi ini akan menerima target $ hash dan $ replacements juga merupakan hash yang mengandung asosiasi newkey => oldkey .
Fungsi ini akan mempertahankan orde asli , tetapi bisa bermasalah untuk array yang sangat besar (seperti catatan 10k di atas) mengenai kinerja & memori .
fungsi alternatif ini akan melakukan hal yang sama, dengan kinerja & penggunaan memori yang jauh lebih baik , dengan biaya kehilangan pesanan asli (yang seharusnya tidak menjadi masalah karena hashtable!)
sumber
kode ini akan membantu untuk mengubah kunci lama ke yang baru
tampilan suka
sumber
Perbandingan tolok ukur sederhana dari kedua solusi.
Solusi 1 Salin dan hapus (pesanan hilang) https://stackoverflow.com/a/240676/1617857
Solusi 2 Ubah nama kunci https://stackoverflow.com/a/21299719/1617857
Hasil:
sumber
Anda dapat menggunakan fungsi ini berdasarkan array_walk:
Memberikan:
sumber
ini berfungsi untuk mengganti nama kunci pertama:
kemudian, print_r ($ a) merender array berurutan yang diperbaiki:
ini berfungsi untuk mengganti nama kunci sewenang-wenang:
print_r ($ a)
fungsi umum:
sumber
Jika Anda ingin mengganti beberapa kunci sekaligus (menjaga urutan):
Pemakaian:
sumber
Ada cara alternatif untuk mengubah kunci elemen array ketika bekerja dengan array penuh - tanpa mengubah urutan array. Ini hanya untuk menyalin array ke array baru.
Misalnya, saya bekerja dengan array multi-dimensi campuran yang berisi kunci yang diindeks dan asosiatif - dan saya ingin mengganti kunci integer dengan nilai-nilai mereka, tanpa melanggar urutan.
Saya melakukannya dengan mengganti kunci / nilai untuk semua entri array numerik - di sini: ['0' => 'foo']. Perhatikan bahwa pesanan masih utuh.
Keluaran:
sumber
Cara terbaik adalah menggunakan referensi, dan tidak menggunakan tidak disetel (yang membuat langkah lain untuk membersihkan memori)
larutan:
Anda memiliki satu referensi asli dan satu dengan nama baru.
atau jika Anda tidak ingin memiliki dua nama dalam satu nilai bagus buat tab lain dan pelajari referensi
Iterasi lebih baik pada kunci daripada mengkloning semua array, dan membersihkan array lama jika Anda memiliki data panjang seperti 100 baris +++ dll.
sumber
Hmm, saya tidak tes sebelumnya, tapi saya pikir kode ini berfungsi
sumber
Salah satu yang dipesan oleh pengawet yang mudah dimengerti:
sumber
Anda dapat menulis fungsi sederhana yang menerapkan panggilan balik ke tombol dari array yang diberikan. Mirip dengan array_map
Berikut adalah intinya https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php .
sumber
Fungsi ini akan mengubah nama kunci array, mempertahankan posisinya, dengan menggabungkan dengan pencarian indeks.
Pemakaian:
sumber
Fungsi dasar ini menangani swapping array keys dan mempertahankan array dalam urutan aslinya ...
Anda kemudian dapat mengulang dan menukar semua 'a' kunci dengan 'z' misalnya ...
sumber