Saya memiliki sebuah array:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Saya ingin mendapatkan elemen pertama dari array ini. Hasil yang diharapkan: string apple
Satu persyaratan: itu tidak dapat dilakukan dengan melewati referensi , jadi array_shift
itu bukan solusi yang baik.
Bagaimana saya bisa melakukan ini?
&$array
params.Jawaban:
Jawaban asli, tetapi mahal (O (n)):
Dalam O (1):
Kasus penggunaan lainnya, dll ...
Jika memodifikasi (dalam arti mengatur ulang array array)
$array
tidak menjadi masalah, Anda dapat menggunakan:Ini seharusnya lebih efisien secara teoritis, jika diperlukan array "copy":
Dengan PHP 5.4+ (tetapi dapat menyebabkan kesalahan indeks jika kosong):
sumber
list()
danreset()
solusi yang jauh lebih bagus menurut saya.Seperti yang ditunjukkan Mike (cara termudah yang mungkin):
Jika Anda ingin mendapatkan kunci: (jalankan setelah reset)
Dari dokumentasi PHP :
Deskripsi:
sumber
foreach
dengan array subjek, Anda akan mengacaukannya.foreach
akan menyalin array yang dilaluinya.key($arr)
dan Anda akan mendapatkan '4' (ditambahkan ke jawaban)reset()
. 2) Tidak, foreach JANGAN membuat salinan array !!! Ini hanya membuat pointer itu sendiri (bahkan bukan salinan yang sudah ada - juga mudah untuk memeriksa, memanggilnext()
sebelum foreach).sumber
Jika Anda tidak ingin kehilangan posisi pointer saat ini, buat saja alias untuk array.
sumber
reset()
sudah mengembalikan elemen pertama, jadi tidak perlu menggunakancurrent()
-echo reset($arr)
harus mencukupicurrent
untukreset
menghindari PHP pemberitahuan / error yang dihasilkan dalam kasus referensi, misalnyacurrent(array_filter(...));
di 3v4l .current($array)
bisa memberi Anda elemen pertama array, menurut manual PHP .Jadi itu berfungsi sampai Anda telah memposisikan ulang pointer array, dan jika tidak Anda harus mengatur ulang array.
sumber
current($array)
hanya akan berfungsi jika pointer array "saat ini" menunjuk ke elemen pertama, jikareset($array)
tidak akan diperlukan.current()
tidak lagi membutuhkan referensi, meskipun dokumen PHP tidak mencerminkan hal ini. Jadi saya pikir ini sudah menjadi solusi terbaik.Anda bisa mendapatkan elemen ke-N dengan konstruksi bahasa, "daftar":
Dengan
array_keys
fungsi ini Anda dapat melakukan hal yang sama untuk kunci:sumber
list($first_value) = $my_array;
Menurut saya, pilihan terbaik. Itu tidak memiliki masalah dari jawaban lain yang disajikan di sini: tidak ada "berlebihan" karena tidak menyalin atau array atau membuat yang baru. Tidak ada "referensi": array tidak diubah. Tidak ada "reset": tidak ada perubahan pada pointer internal array ...int
, coba lakukanlist($firstItem) = array('key1' => 'value1');
dan Anda akan mendapatkan kesalahanNotice: Undefined offset: 0
list($x) = foo();
sama dengan$x = foo()[0];
. Perhatikan bahwa ini tidak harus sama dengan "dapatkan item pertama", karena bahkan array integer-indexed mungkin tidak memiliki elemen dengan kunci 0. Dalam kasus saya saya lakukan "daftar ($ order) = get_order ($ user) ; " tetapi "get_order" mengembalikan pesanan yang dikunci oleh ID mereka, yang biasanya bukan 0. Seperti yang dikatakan @Sergiy, array_values () memperbaikinya, tetapi mengurangi efisiensi dan (lebih penting) keterbacaan kode.PHP 5.4+:
sumber
$array_values = array_values($array); $value = $array_values[0];
PHP 7.3 menambahkan dua fungsi untuk mendapatkan kunci pertama dan terakhir dari array secara langsung tanpa modifikasi dari array asli dan tanpa membuat objek sementara:
Selain bermakna secara semantik, fungsi-fungsi ini bahkan tidak memindahkan pointer array (seperti yang
foreach
akan dilakukan).Memiliki kunci, seseorang bisa mendapatkan nilai dengan kunci secara langsung.
Contoh (semuanya membutuhkan PHP 7.3+)
Mendapatkan kunci dan nilai pertama / terakhir:
Mendapatkan nilai pertama / terakhir sebagai satu-liner, dengan asumsi array tidak boleh kosong :
Mendapatkan nilai pertama / terakhir sebagai satu-liner, dengan default untuk array kosong:
sumber
$first_value = $my_array[array_key_first($my_array)] ?? null;
Seharusnya:
Cukup gunakan:
untuk mendapatkan elemen pertama atau
untuk mendapatkan kunci pertama.
Atau Anda dapat memutuskan tautan yang pertama jika Anda ingin menghapusnya.
sumber
current
?Beberapa array tidak berfungsi dengan fungsi seperti
list
,reset
ataucurrent
. Mungkin mereka array "palsu" - misalnya mengimplementasikan ArrayIterator, misalnya.Jika Anda ingin menarik nilai pertama terlepas dari array, Anda dapat membuat hubungan pendek iterator:
Nilai Anda kemudian akan tersedia di
$value
dan loop akan rusak setelah iterasi pertama. Ini lebih efisien daripada menyalin array yang berpotensi besar ke fungsi seperti array_unshift (array_values ($ arr)).Anda dapat mengambil kunci dengan cara ini juga:
Jika Anda memanggil ini dari suatu fungsi, cukup kembali lebih awal:
sumber
Dari pembantu Laravel :
Array yang diteruskan oleh nilai ke fungsi, reset () memengaruhi pointer internal dari salinan array, dan array tersebut tidak menyentuh array asli (perhatikan bahwa ia mengembalikan
false
jika array kosong).Contoh penggunaan:
Juga, inilah alternatifnya. Ini sedikit lebih cepat, tetapi lebih menarik. Itu memungkinkan dengan mudah mengubah nilai default jika array kosong:
Sebagai catatan, inilah jawaban saya yang lain , untuk elemen terakhir array.
sumber
Buat ini tetap sederhana! Ada banyak jawaban yang benar di sini, tetapi untuk meminimalkan semua kebingungan, kedua ini berfungsi dan mengurangi banyak overhead:
key($array)
mendapatkan kunci pertama dari sebuah arraycurrent($array)
mendapatkan nilai pertama dari sebuah arrayEDIT:
Mengenai komentar di bawah ini. Contoh berikut akan menampilkan:
string(13) "PHP code test"
sumber
current
sama dengan elemen saat ini. Anda harus mengatur ulang pointer ke awal array untuk memastikan itu sebenarnya di awal.Cukup lakukan:
sumber
Saya akan lakukan
echo current($array)
.sumber
current()
tidak salah ketika non-referensi dilewatkan. Asalkan pointer masih di awal ini berfungsi.reset
menghasilkan pemberitahuan "Hanya variabel yang harus dilewati dengan referensi" sementaracurrent
tidak: Contoh PHP Editor Onlinecurrent(array_filter(...));
.next()
,end()
atau fungsi lain yang memodifikasi pointer internal array. Dalam contoh saya,current()
mengembalikan nol karena pointer internal "di luar jangkauan" array. Tapi itu mungkin 'hampir' menunjuk ke elemen / acak juga.Keluaran:
sumber
sumber
Ini jauh lebih efisien daripada
array_values()
karenaeach()
fungsi tidak menyalin seluruh array.Untuk info lebih lanjut, lihat http://www.php.net/manual/en/function.each.php
sumber
because the each() function does not copy the entire array.
+1Cara kludgy adalah:
sumber
reset()
sebagai pointer array diatur ulang sebelumforeach
dipanggil pula.Dapatkan elemen pertama:
Dapatkan elemen terakhir
sumber
Sebagian besar berhasil! TETAPI untuk panggilan saluran tunggal cepat (sumber daya rendah):
Meskipun ini berfungsi, dan cukup baik, silakan lihat juga jawaban tambahan saya: https://stackoverflow.com/a/48410351/1804013
sumber
current($array)
, yang mengharuskan pointer internal array berada pada elemen pertama, dalam hal ini,echo reset($array)
yang paling tepat.Saya pikir menggunakan array_values akan menjadi taruhan terbaik Anda di sini. Anda bisa mengembalikan nilai pada indeks nol dari hasil fungsi itu untuk mendapatkan 'apel'.
sumber
Ini sedikit terlambat untuk permainan, tetapi saya dihadapkan dengan masalah di mana array saya mengandung elemen array sebagai anak-anak di dalamnya, dan dengan demikian saya tidak bisa hanya mendapatkan representasi string dari elemen array pertama. Dengan menggunakan
current()
fungsi PHP , saya mengatur ini:Berkat semua solusi saat ini membantu saya mendapatkan jawaban ini, saya harap ini membantu seseorang kapan saja!
sumber
Menggunakan:
Secara default,
array_slice
tidak menyimpan kunci, jadi kami dapat menggunakan nol dengan aman sebagai indeks.sumber
Dua solusi untuk Anda.
Solusi 1 - Cukup gunakan kunci. Anda belum mengatakan bahwa Anda tidak dapat menggunakannya. :)
Solusi 2 - array_flip () + key ()
Solusi 3 - array_keys ()
sumber
Ini bukan tanggapan yang begitu sederhana di dunia nyata. Misalkan kita memiliki contoh tanggapan yang mungkin ini yang dapat Anda temukan di beberapa perpustakaan.
Seperti yang Anda lihat, kami memiliki beberapa solusi 'satu baris' yang bekerja dengan baik dalam beberapa kasus, tetapi tidak semuanya.
Menurut pendapat saya, Anda harus menangani itu hanya dengan array.
Sekarang berbicara tentang kinerja, dengan asumsi bahwa kita selalu menyusun, seperti ini:
array_shift
lebih cepat darireset
, itu lebih cepat dari [hitungan () - 1], dan ketiganya lebih cepat dariarray_values
danarray_slice
.sumber
Saya membayangkan penulis baru saja mencari cara untuk mendapatkan elemen pertama dari array setelah mendapatkannya dari beberapa fungsi ( mysql_fetch_row , misalnya) tanpa menghasilkan STRICT "Hanya variabel yang harus dilewatkan dengan referensi".
Jika demikian, hampir semua cara yang dijelaskan di sini akan mendapatkan pesan ini ... dan beberapa dari mereka menggunakan banyak memori tambahan untuk menduplikasi array (atau sebagian darinya). Cara mudah untuk menghindarinya adalah dengan hanya memberikan nilai sebaris sebelum memanggil fungsi-fungsi tersebut:
Dengan cara ini Anda tidak mendapatkan pesan STRICT di layar, atau di log, dan Anda tidak membuat array tambahan. Ia bekerja dengan array yang diindeks DAN asosiatif.
sumber
Saya suka contoh "daftar", tetapi "daftar" hanya berfungsi di sisi kiri tugas. Jika kita tidak ingin menetapkan variabel, kita akan dipaksa untuk membuat nama sementara, yang paling mencemari ruang lingkup kita dan paling buruk menimpa nilai yang ada:
Di atas akan menimpa nilai $ x yang ada, dan variabel $ x akan bertahan selama lingkup ini aktif (akhir dari fungsi / metode ini, atau selamanya jika kita berada di level atas). Ini bisa dikerjakan menggunakan call_user_func dan fungsi anonim, tapi kikuk:
Jika kita menggunakan fungsi anonim seperti ini, kita sebenarnya bisa pergi dengan reset dan array_shift, meskipun mereka menggunakan pass-by-reference. Ini karena memanggil fungsi akan mengikat argumennya, dan argumen ini dapat dilewatkan dengan referensi:
Namun, ini sebenarnya berlebihan, karena call_user_func akan melakukan tugas sementara ini secara internal. Ini memungkinkan kami memperlakukan fungsi pass-by-reference seolah-olah itu adalah pass-by-value, tanpa peringatan atau kesalahan apa pun:
sumber
Perubahan kecil pada apa yang diposting Sarfraz adalah:
sumber
Saya tidak suka mengutak-atik pointer internal array, tetapi juga tidak efisien untuk membangun array kedua dengan
array_keys()
atauarray_values()
, jadi saya biasanya mendefinisikan ini:sumber
Coba ini:
sumber