Bagaimana saya bisa mendapatkan kunci terakhir dari sebuah array?
Bagaimana saya bisa mendapatkan kunci terakhir dari sebuah array?
Jawaban:
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.
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 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!
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 ??
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]; }
lastke elemen terakhir. Membuat end()cukup banyak O (1). :-)
saya lebih memilih
end(array_keys($myarr))
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
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
akan menampilkan
orange
Cukup gunakan: echo $array[count($array) - 1];
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.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
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:
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 () .nulljika 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 )
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
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
?>
array_pop()beroperasi pada nilai pengembalian array_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 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()
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
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);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
Coba yang ini dengan array_reverse().
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
$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
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().