Harus menentukan array asosiatif, array numerik, atau jika harus bekerja pada keduanya.
Jimbo Jonny
pertanyaan yang sering diajukan
Josua Marcel Chrisano
Jawaban:
610
Sebuah solusi adalah dengan menggunakan kombinasi dari enddan (mengutip) :key
end() memajukan pointer internal array ke elemen terakhir, dan mengembalikan nilainya.
key() mengembalikan elemen indeks dari posisi array saat ini.
Jadi, sebagian kode seperti ini harus melakukan trik:
$array = array('first'=>123,'second'=>456,'last'=>789,);end($array);// move the internal pointer to the end of the array
$key = key($array);// fetches the key of the element pointed to by the internal pointer
var_dump($key);
Akan menghasilkan:
string'last'(length=4)
yaitu kunci elemen terakhir dari array saya.
Setelah ini dilakukan, pointer internal array akan berada di akhir array. Seperti yang ditunjukkan dalam komentar, Anda mungkin ingin menjalankan reset()array untuk membawa pointer kembali ke awal array.
@Pim: tergantung pada apa yang OP ingin lakukan dengan array itu setelahnya (mungkin tidak diperlukan untuk memanggil reset()) ;; tetapi Anda benar dalam menunjuk fungsi itu, yang bisa bermanfaat.
Pascal MARTIN
3
@PascalMARTIN +1 Saya pikir menambahkan komentar tentang reset () dalam jawaban Anda akan sangat membantu.
Lulu
Pendekatan ini tidak berfungsi jika array memiliki nilai duplikat. misalnya. untuk array('a', 'b', 'c', 'd', 'a')itu akan mengembalikan kunci 0 daripada 4.
Marc
2
@ Markc pendekatan ini berfungsi dengan benar bahkan jika ada nilai duplikat.
Jeff
1
@ pppp itu tidak berfungsi karena ... periksa bagian akhir () kembali dan kemudian pikirkan lagi;)
forsberg
79
Meskipun end()tampaknya yang paling mudah, itu bukan yang tercepat. Alternatif yang lebih cepat, dan lebih kuat adalah array_slice():
bersemangat dengan jawaban ini, saya melakukan tes cepat dari 100.000 iterasi, membandingkan (a) end($arr);$key = key($arr);reset($arr);terhadap (b) $key = key(array_slice($arr,-1,1,true));... yang menghasilkan end()JAUH lebih cepat! end () = 0,05326 detik, array_slice = 8,556 detik ... ya ??
neokio
54
Fungsi bawaan PHP dibangun oleh kutu buku yang ekstrim. Jangan mencoba membuat ulang fungsi-fungsi itu. Kemungkinannya adalah Anda membuat sesuatu yang jauh lebih lambat dari aslinya. Kecuali jika Anda adalah semacam penyihir jahat, pemikat.
dmmd
16
end()lebih cepat karena dapat diturunkan dari fungsi-C yang sangat sederhana, seperti:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
Gustav
10
@ Gustav Saya percaya C-implementasi yang mendasari PHP, sebenarnya memiliki pointer internal lastke elemen terakhir. Membuat end()cukup banyak O (1). :-)
Eric
15
@ dmmd, saya yakin tim PHP akan sangat senang mereka disebut kutu buku.
menyebabkan PEMBERITAHUAN KETAT, akhirnya mengharapkan referensi variabel
Wiliam
25
Anda dapat menggunakannya end((array_keys($myarr)))untuk menyiasati pemberitahuan.
Ben Fortune
9
@BenFortune Ini telah diperbaiki di PHP7: "Dalam PHP 5, menggunakan tanda kurung redundan di sekitar parameter fungsi dapat meredam peringatan standar ketat ketika parameter fungsi diteruskan dengan referensi. Peringatan sekarang akan selalu dikeluarkan."
Dominic Scheirlinck
itu peringatan yang sama sekali tidak perlu! itu hal yang biasa dan biasa dalam semua bahasa lain!
azerafati
1
Dalam bahasa lain, fungsi tidak beroperasi pada pointer, bukan?
Horray! Saya akan menambahkan jawaban ini. Bisakah Anda menyoroti versi "PHP 7.3" dan tahun 2018? Akan lebih mudah untuk melihat berita luar biasa ini untuk orang lain
Tomáš Votruba
Juga bagus untuk menyebutkan bahwa ini TIDAK mempengaruhi pointer array internal.
Ini hanya berfungsi jika Anda memiliki array numerik. Gagal dengan array asosiasi.
Jeremy J Starcher
12
Tidak hanya ini hanya bekerja pada array numerik, ia gagal menunjukkan kunci tetapi menunjukkan nilainya, bukan?
Nanne
saya juga jake, bisakah kita melakukan sesuatu di mana kita membagi ini (mari kita jujur) top google hit menjadi numerik dan asosiatif sehingga kita memiliki referensi lama untuk keduanya ... Saya hanya bekerja itu untuk assoc setelah parsing int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }yang menarik tetapi tidak baik untuk bisnis ketika Anda memiliki anggaran waktu
lol
5
Juga, bahkan untuk array numerik, ingatlah bahwa array numerik tidak harus berurutan, atau gunakan semua angka. Ini akan bekerja jika Anda tidak secara eksplisit menetapkan nilai numerik, tetapi jika Anda melakukannya $a[1] = 1; $a[5] = 5; $a[0] = 0;Kemudian Anda akan memiliki array dengan kunci (1, 5, 0), dalam urutan itu. count($a)akan menghasilkan 3 dan $a[2]tidak didefinisikan. Itu tentu tidak memberi Anda 5 kembali.
Daniel Skarbek
1
Baca lagi pertanyaan "Bagaimana cara mendapatkan kunci terakhir dalam array?"
20
Tidak tahu apakah ini akan menjadi lebih cepat atau tidak, tetapi tampaknya lebih mudah untuk melakukannya dengan cara ini, dan Anda menghindari kesalahan dengan tidak meneruskan fungsi untuk mengakhiri () ...
itu hanya membutuhkan sebuah variabel ... bukan masalah besar untuk menulis satu baris kode lagi, lalu unset jika Anda perlu.
Jawaban ini (walaupun secara teknis benar) boros / tidak efisien karena membutuhkan penciptaan array tambahan (dengan panjang yang sama dengan aslinya). Ini berarti bahwa pemborosan meningkat seperti array aslinya. Ini tidak boleh dipilih dari jawaban efisien Pascal MARTIN. Saya terkejut ini memiliki begitu banyak upvotes.
mickmackusa
12
Pada PHP7.3 Anda dapat langsung mengakses kunci terakhir di (level luar) array dengan array_key_last ()
Yang definitif menempatkan banyak perdebatan di halaman ini. Ini adalah pemain dengan performa terbaik, tidak menderita efek samping, dan merupakan teknik panggilan tunggal langsung, intuitif untuk memberikan apa yang dicari pertanyaan ini.
* Test array berisi 500000 elemen, microtime diulang 100x kemudian dirata-rata kemudian dikalikan dengan 1000 untuk menghindari notasi ilmiah. Penghargaan untuk @MAChitgarha untuk tolok ukur awal yang dikomentari di bawah jawaban @ TadejMagajna .
Ini berarti Anda dapat mengambil nilai kunci terakhir tanpa:
memindahkan pointer array (yang membutuhkan dua baris kode) atau
menyortir, membalikkan, muncul, menghitung, mengindeks array kunci, atau tindakan bodoh lainnya
Fungsi ini sudah lama ditunggu dan merupakan tambahan yang disambut dengan sabuk alat fungsi array yang meningkatkan kinerja, menghindari efek samping yang tidak diinginkan, dan memungkinkan kode bersih / langsung / intuitif.
Fungsi saudara yang dibuang ( array_value_first()& array_value_last()) juga akan menawarkan akses pointer-ignorant ke elemen bookend, tetapi mereka jelas gagal mengumpulkan suara yang cukup untuk dihidupkan kembali.
Berikut adalah beberapa halaman yang relevan membahas fitur-fitur baru:
Jawaban ini harus ada di daftar teratas. Ini cukup lengkap.
Yohanes
1
Wow, DV tentang jawaban saya ini? Apa masalahnya, terlalu komprehensif / pasti / jelas / didukung? Pfft. Pasti terus menekan posting yang berani menginformasikan. Kerja bagus. Jika Anda tidak tahu, tombol DV untuk posting yang "tidak berguna". Silakan tanyakan pada diri Anda apa tujuan Anda di sini.
Ini sangat lambat jika array Anda memiliki lebih dari 1 hal di dalamnya. Tolong jangan lakukan ini.
Andrey
3
dan menyebabkan PEMBERITAHUAN STRICT juga, referensi variabel
Wiliam
array_pop () akan mempersingkat array asli (menghapus elemen terakhir). Saya tidak yakin apakah ini penting atau tidak untuk OP tetapi pasti akan berarti bagi orang lain.
Programster
1
Tidak juga. Dalam contoh ini array_pop()beroperasi pada nilai pengembalian array_keys()dan bukan pada array asli.
Petko Bossakov
Karena ada jawaban lain yang lebih efisien yang tidak memicu PEMBERITAHUAN, saya menurunkan jawaban ini.
mickmackusa
6
Pada PHP> = 7.3 array_key_last()adalah cara terbaik untuk mendapatkan kunci terakhir dari salah satu array. Menggunakan kombinasi end(), key()dan reset()hanya untuk mendapatkan kunci terakhir dari sebuah array adalah keterlaluan.
Saya juga ingin menawarkan solusi alternatif untuk masalah ini.
Dengan asumsi semua kunci Anda numerik tanpa celah, metode yang saya pilih adalah menghitung array kemudian minus 1 dari nilai itu (untuk memperhitungkan fakta bahwa kunci array mulai dari 0.
Karena jawaban ini hanya berurusan dengan sebagian kecil dari kemungkinan array (numerik, array berurutan berurutan), jawaban ini tidak menawarkan jawaban yang kuat / benar untuk pertanyaan umum OP. Downvote.
Membalikkan seluruh array hanya untuk menarik satu nilai tentu saja kurang efisien daripada metode PascalMARTIN. Meskipun secara teknis benar, itu tidak boleh digunakan sebagai pengganti pendekatan Pascal.
mickmackusa
3
Saya hanya mengambil fungsi pembantu dari Xander dan memperbaikinya dengan jawaban sebelumnya:
Jawaban:
Sebuah solusi adalah dengan menggunakan kombinasi dari
end
dan (mengutip) :key
end()
memajukan pointer internal array ke elemen terakhir, dan mengembalikan nilainya.key()
mengembalikan elemen indeks dari posisi array saat ini.Jadi, sebagian kode seperti ini harus melakukan trik:
Akan menghasilkan:
yaitu kunci elemen terakhir dari array saya.
Setelah ini dilakukan, pointer internal array akan berada di akhir array. Seperti yang ditunjukkan dalam komentar, Anda mungkin ingin menjalankan
reset()
array untuk membawa pointer kembali ke awal array.sumber
reset()
) ;; tetapi Anda benar dalam menunjuk fungsi itu, yang bisa bermanfaat.array('a', 'b', 'c', 'd', 'a')
itu akan mengembalikan kunci 0 daripada 4.Meskipun
end()
tampaknya yang paling mudah, itu bukan yang tercepat. Alternatif yang lebih cepat, dan lebih kuat adalaharray_slice()
:Seperti yang dikatakan dalam tes , pada array dengan 500000 elemen, hampir 7x lebih cepat!
sumber
end($arr);$key = key($arr);reset($arr);
terhadap (b)$key = key(array_slice($arr,-1,1,true));
... yang menghasilkanend()
JAUH lebih cepat! end () = 0,05326 detik, array_slice = 8,556 detik ... ya ??end()
lebih cepat karena dapat diturunkan dari fungsi-C yang sangat sederhana, seperti:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
ke elemen terakhir. Membuatend()
cukup banyak O (1). :-)saya lebih memilih
sumber
end((array_keys($myarr)))
untuk menyiasati pemberitahuan.Sejak PHP 7.3 (2018) ada (akhirnya) fungsi untuk ini: http://php.net/manual/en/function.array-key-last.php
akan menampilkan
sumber
Cukup gunakan:
echo $array[count($array) - 1];
sumber
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
yang menarik tetapi tidak baik untuk bisnis ketika Anda memiliki anggaran waktu$a[1] = 1; $a[5] = 5; $a[0] = 0;
Kemudian Anda akan memiliki array dengan kunci (1, 5, 0), dalam urutan itu.count($a)
akan menghasilkan 3 dan$a[2]
tidak didefinisikan. Itu tentu tidak memberi Anda 5 kembali.Tidak tahu apakah ini akan menjadi lebih cepat atau tidak, tetapi tampaknya lebih mudah untuk melakukannya dengan cara ini, dan Anda menghindari kesalahan dengan tidak meneruskan fungsi untuk mengakhiri () ...
itu hanya membutuhkan sebuah variabel ... bukan masalah besar untuk menulis satu baris kode lagi, lalu unset jika Anda perlu.
sumber
Pada PHP7.3 Anda dapat langsung mengakses kunci terakhir di (level luar) array dengan array_key_last ()
Yang definitif menempatkan banyak perdebatan di halaman ini. Ini adalah pemain dengan performa terbaik, tidak menderita efek samping, dan merupakan teknik panggilan tunggal langsung, intuitif untuk memberikan apa yang dicari pertanyaan ini.
Tolok ukur kasar sebagai bukti: https://3v4l.org/hO1Yf
Ini berarti Anda dapat mengambil nilai kunci terakhir tanpa:
Fungsi ini sudah lama ditunggu dan merupakan tambahan yang disambut dengan sabuk alat fungsi array yang meningkatkan kinerja, menghindari efek samping yang tidak diinginkan, dan memungkinkan kode bersih / langsung / intuitif.
Ini demo :
Keluaran:
Beberapa catatan:
array_key_last()
adalah fungsi saudara dari array_key_first () .null
jika array kosong.array_value_first()
&array_value_last()
) juga akan menawarkan akses pointer-ignorant ke elemen bookend, tetapi mereka jelas gagal mengumpulkan suara yang cukup untuk dihidupkan kembali.Berikut adalah beberapa halaman yang relevan membahas fitur-fitur baru:
ps Jika ada yang menimbang beberapa teknik lain, Anda dapat merujuk pada koleksi perbandingan kecil ini: ( Demo )
sumber
Coba gunakan fungsi array_pop dan array_keys sebagai berikut:
sumber
array_pop()
beroperasi pada nilai pengembalianarray_keys()
dan bukan pada array asli.Pada PHP> = 7.3
array_key_last()
adalah cara terbaik untuk mendapatkan kunci terakhir dari salah satu array. Menggunakan kombinasiend()
,key()
danreset()
hanya untuk mendapatkan kunci terakhir dari sebuah array adalah keterlaluan.bandingkan dengan
Anda harus mengatur ulang array agar pointer berada di awal jika Anda menggunakan kombinasi dari
end()
dankey()
sumber
Saya juga ingin menawarkan solusi alternatif untuk masalah ini.
Dengan asumsi semua kunci Anda numerik tanpa celah, metode yang saya pilih adalah menghitung array kemudian minus 1 dari nilai itu (untuk memperhitungkan fakta bahwa kunci array mulai dari 0.
Ini akan memberi Anda:
sumber
Anda bisa menggunakan ini:
Solusi lain adalah membuat fungsi dan menggunakannya:
sumber
sumber
Saya hanya mengambil fungsi pembantu dari Xander dan memperbaikinya dengan jawaban sebelumnya:
sumber
Coba yang ini dengan
array_reverse()
.sumber
Sungguh aneh, tetapi mengapa topik ini tidak memiliki jawaban ini:
$lastKey = array_keys($array)[count($array)-1];
sumber
Ini berfungsi karena PHP memindahkan pointer pointer-nya secara internal untuk $ array
sumber
Solusi terbaik yang dapat digunakan juga digunakan inline:
Solusi ini hanya ekspresi / pernyataan dan memberikan yang baik bukanlah kinerja terbaik.
Penggunaan contoh inline:
UPDATE: Di PHP 7.3+: gunakan (tentu saja) metode yang baru ditambahkan
array_key_last()
.sumber