Apa cara terbaik untuk menentukan kunci pertama dalam array asosiatif? Saya pertama kali berpikir untuk hanya melihat array dan kemudian segera memecahnya, seperti ini:
foreach ($an_array as $key => $val) break;
Dengan demikian memiliki $ key berisi kunci pertama, tetapi ini tampaknya tidak efisien. Adakah yang punya solusi yang lebih baik?
foreach
secara semantik salah.each($arr)['key']
ataueach($arr)[0]
mau bekerja.0.0107
0.0217
Jawaban:
Pembaruan 2019
Mulai dari PHP 7.3 , ada fungsi built-in baru
array_key_first()
yang disebut yang akan mengambil kunci pertama dari array yang diberikan tanpa mengatur ulang pointer internal. Lihatlah dokumentasi untuk informasi lebih lanjut.Anda dapat menggunakan
reset
dankey
:Ini pada dasarnya sama dengan kode awal Anda, tetapi dengan sedikit overhead, dan lebih jelas apa yang terjadi.
Hanya ingat untuk menelepon
reset
, atau Anda bisa mendapatkan salah satu kunci dalam array. Anda juga dapat menggunakanend
alih-alihreset
untuk mendapatkan kunci terakhir.Jika Anda ingin kunci untuk mendapatkan nilai pertama,
reset
sebenarnya kembalikan:Ada satu kasus khusus yang harus diperhatikan (jadi, periksa panjang array terlebih dahulu):
sumber
reset()
juga terjadi untuk mengembalikan elemen pertama (nilai, bukan kunci) dari array apa pun, yang dapat berguna juga.reset()
mengatakanDon't use
reset () `untuk mendapatkan nilai pertama dari array asosiatif. Ini berfungsi bagus untuk array yang benar tetapi bekerja secara tidak terduga pada objek Iterator. bugs.php.net/bug.php?id=38478 `Apakah itu masih benar? Saya bingungarray
objek, tetapi objek khusus (yang bukan array sebenarnya). Saya kira mereka mendapat perbedaan dalam struktur data bingung, tetapi pada dasarnya,reset
mengembalikan nilai "kunci" pertama, yang untuk objek akan menjadi$prop
dalam contoh yang diberikan dalam laporan "bug", tetapi untuk array kunci pertama. Jadi jangan khawatir, selama Anda menggunakan array nyata (dibuat denganarray(…)
), Anda tidak akan punya masalah.next
,reset
,end
atau perulangan melalui array), Anda tidak akan mendapatkan nilai yang diharapkan ketika Anda meneleponkey
. Jadi ya, selalu teleponreset
sebelum menggunakankey
untuk memastikan Anda mendapatkan yang Anda inginkan.array_keys
mengembalikan array kunci. Ambil entri pertama. Atau, Anda bisa memanggilreset
array, dan selanjutnyakey
. Pendekatan terakhir mungkin sedikit lebih cepat (Thoug saya tidak mengujinya), tetapi memiliki efek samping mengatur ulang pointer internal.sumber
foreach
+break
danreset
+key
sebenarnya. Tapi yang pertama terlihat agak aneh, jadi untuk masalah gaya, saya lebih suka yang terakhir.foreach
tidak membuat salinan internal untuk itu, melainkan hanya mengulang pointer. , mirip dengan menggunakan level yang lebih rendahnext
,current
dll.Cukup menarik, loop foreach sebenarnya adalah cara paling efisien untuk melakukan ini.
Karena OP secara khusus bertanya tentang efisiensi, harus ditunjukkan bahwa semua jawaban saat ini sebenarnya jauh lebih efisien daripada pendahuluan.
Saya melakukan benchmark dengan php 5.4, dan metode reset / pointer kunci (jawaban yang diterima) tampaknya sekitar 7 kali lebih lambat daripada foreach. Pendekatan lain yang memanipulasi seluruh array (array_keys, array_flip) jelas bahkan lebih lambat dari itu dan menjadi lebih banyak lebih buruk ketika bekerja dengan array besar.
Foreach sama sekali tidak efisien, jangan ragu untuk menggunakannya!
Edit 2015-03-03:
Skrip benchmark telah diminta, saya tidak punya yang asli tetapi membuat beberapa tes baru sebagai gantinya. Kali ini saya menemukan foreach hanya sekitar dua kali lebih cepat dari reset / kunci. Saya menggunakan array 100-kunci dan menjalankan setiap metode sejuta kali untuk mendapatkan beberapa perbedaan nyata, inilah kode tolok ukur sederhana:
Pada php saya 5.5 output ini:
reset + key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
sumber
foreach
jangan pernah menyalin array kecuali Anda langsung memodifikasinya di dalam foreach loop. Pada php5 struktur array dapat disalin dalam beberapa kasus (ketika refcount> 1) dan Anda benar itu bisa menjadi pengaruh yang signifikan di sana. Untungnya tidak ada yang perlu dikhawatirkan di php7, di mana masalah ini diselesaikan. Berikut ini adalah bacaan yang bagus tentang bagaimana foreach bekerja di bawah tenda sekarang dan bagaimana cara kerjanya di masa lalu.key($an_array)
akan memberi Anda kunci pertamaedit per Blixt: Anda harus memanggil
reset($array);
sebelumnyakey($an_array)
untuk mengatur ulang pointer ke awal array.sumber
Kamu bisa mencoba
sumber
Untuk 2018+
Dimulai dengan PHP 7.3, ada
array_key_first()
fungsi yang mencapai hal ini:Dokumentasi tersedia di sini . 😉
sumber
sumber
Jika efisiensi tidak terlalu penting bagi Anda, Anda dapat menggunakannya
array_keys($yourArray)[0]
dalam PHP 5.4 (dan lebih tinggi).Contoh:
Keuntungan dibandingkan solusi:
adalah bahwa Anda dapat lulus
array_keys($arr)[0]
sebagai parameter fungsi (misdoSomething(array_keys($arr)[0], $otherParameter)
).HTH
sumber
array_keys($arr)[0]
sintaksis valid?array dereferencing
. Lihat misalnya: schlueters.de/blog/archives/…Silakan temukan yang berikut ini:
Contoh kerja:
sumber
sumber
max()
dosis tidak mengembalikan kunci pertama dari array assoc. max mengembalikan nilai maksimum daftar atau item arrayIni juga bisa menjadi solusi:
Saya telah mengujinya dan berfungsi.
Kode Kerja .
sumber
Untuk menyempurnakan solusi Webmut , saya telah menambahkan solusi berikut:
Output untuk saya di PHP 7.1 adalah:
Jika saya melakukan ini untuk array ukuran 10.000, maka hasilnya menjadi
Metode array_keys waktu 30 detik (dengan hanya 1000 elemen, waktu untuk sisanya hampir sama, tetapi metode array_keys memiliki sekitar 7,5 detik).
sumber
sumber
Cara terbaik yang berhasil bagi saya adalah
array_keys
mendapat larik kunci dari larik awal dan kemudianarray_shift
memotong darinya nilai elemen pertama. Anda akan membutuhkan PHP 5.4+ untuk ini.sumber
Ini adalah cara termudah yang pernah saya temukan. Cepat dan hanya dua baris kode :-D
sumber
php73:
http://php.net/manual/en/function.array-key-first.php
sumber
Satu kalimat:
sumber
Hari ini saya harus mencari kunci pertama dari array saya yang dikembalikan oleh permintaan POST. (Dan catat nomor untuk id formulir dll)
Yah, saya telah menemukan ini: Kembalikan kunci pertama array asosiatif di PHP
http://php.net/key
Saya sudah melakukan ini, dan itu berhasil.
Mungkin itu akan lebih baik dari pria lain. CYA.
sumber
Anda dapat bermain dengan array Anda
Untuk mendapatkan elemen pertama array yang dapat Anda gunakan
current
dan untuk elemen terakhir Anda dapat menggunakanend
Edit
Demi tidak mendapatkan suara turun lagi untuk jawaban, Anda dapat mengonversi kunci Anda untuk menggunakan
array_keys
dan menggunakan nilai seperti yang ditunjukkan di atas.sumber