Bagaimana cara mendapatkan kunci terakhir dalam sebuah array?

335

Bagaimana saya bisa mendapatkan kunci terakhir dari sebuah array?

ajsie
sumber
10
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.

Pascal MARTIN
sumber
17
@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():

$lastKey = key(array_slice($array, -1, 1, true));

Seperti yang dikatakan dalam tes , pada array dengan 500000 elemen, hampir 7x lebih cepat!

Tadej Magajna
sumber
98
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.
datan.io
53

saya lebih memilih

end(array_keys($myarr))
Rutger van Baren
sumber
19
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?
jurchiks
52

Sejak PHP 7.3 (2018) ada (akhirnya) fungsi untuk ini: http://php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

akan menampilkan

orange
Patryk Godowski
sumber
4
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.
mvorisek
30

Cukup gunakan: echo $array[count($array) - 1];

Aditya Choudhary
sumber
75
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.

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);
Ryan Hungate
sumber
2
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.

Tolok ukur kasar sebagai bukti: https://3v4l.org/hO1Yf

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015

* 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:

  1. memindahkan pointer array (yang membutuhkan dua baris kode) atau
  2. 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.

Ini demo :

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

Keluaran:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

Beberapa catatan:

  • array_key_last()adalah fungsi saudara dari array_key_first () .
  • Kedua fungsi ini adalah "pointer-ignorant".
  • Kedua fungsi kembali nulljika array kosong.
  • 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:

ps Jika ada yang menimbang beberapa teknik lain, Anda dapat merujuk pada koleksi perbandingan kecil ini: ( Demo )

Duration of array_slice() + key():     0.35353660583496
Duration of end() + key():             6.7495584487915
Duration of array_key_last():          0.00025749206542969
Duration of array_keys() + end():      7.6123380661011
Duration of array_reverse() + key():   6.7875385284424
Duration of array_slice() + foreach(): 0.28870105743408
mickmackusa
sumber
2
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.
mickmackusa
8

Coba gunakan fungsi array_pop dan array_keys sebagai berikut:

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>
codaddict
sumber
14
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.

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

bandingkan dengan

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

Anda harus mengatur ulang array agar pointer berada di awal jika Anda menggunakan kombinasi dari end()dankey()

Hilary Okoro
sumber
4

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.

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

Ini akan memberi Anda:

int (1) kucing


sumber
1
Ini tidak akan berfungsi untuk array di mana kunci tidak tambahan misal array (0 => 'dog', 5 => 'cat'); $ lastKey akan mengembalikan nilai yang salah
kakoma
@kakoma - Seperti posting saya mengatakan "Dengan asumsi semua kunci Anda adalah numerik tanpa celah".
Bagi siapa saja yang bertanya-tanya gunakan "array_values" PHP untuk merekam kembali array ke urutan numerik. php.net/manual/en/function.array-values.php
1
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.
mickmackusa
4

Anda bisa menggunakan ini:

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

Solusi lain adalah membuat fungsi dan menggunakannya:

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
Atif Tariq
sumber
1
Jawaban ini tidak memberikan hal baru yang belum ada di utas ini.
Martin
1
Martin, tidak ada yang menggunakan fungsi untuk mendapatkan hasilnya.
Atif Tariq
1
apakah Anda perlu menambahkan 1 baris kode ke suatu fungsi? Itu antarmuka yang agak tidak perlu.
Martin
1
Martin, yang satu baris.
Atif Tariq
2
garis dalam fungsi Anda
Martin
3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
voodoo417
sumber
2
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:

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));
Steve
sumber
1

Coba yang ini dengan array_reverse().

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);
Vishal Kumar
sumber
1

Sungguh aneh, tetapi mengapa topik ini tidak memiliki jawaban ini:

$lastKey = array_keys($array)[count($array)-1];

Alex
sumber
0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

Ini berfungsi karena PHP memindahkan pointer pointer-nya secara internal untuk $ array

Scottymeuk
sumber
2
Ini adalah duplikat dari metode PascalMARTIN. Silakan simpan halaman ini dan hapus jawaban terlambat / duplikat Anda. Diturunkan.
mickmackusa
0

Solusi terbaik yang dapat digunakan juga digunakan inline:

end($arr) && false ?: key($arr)

Solusi ini hanya ekspresi / pernyataan dan memberikan yang baik bukanlah kinerja terbaik.

Penggunaan contoh inline:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


UPDATE: Di PHP 7.3+: gunakan (tentu saja) metode yang baru ditambahkan array_key_last().

mvorisek
sumber