Baik,
Saya tahu semua tentang array_pop()
, tetapi itu menghapus elemen terakhir. Apa cara terbaik untuk mendapatkan elemen terakhir dari array tanpa menghapusnya?
EDIT: Ini bonusnya:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
atau bahkan
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
Jawaban:
Banyak jawaban di utas ini memberi kami banyak pilihan berbeda. Untuk dapat memilih dari mereka, saya perlu memahami perilaku dan kinerja mereka. Dalam jawaban ini saya akan membagikan temuan saya dengan Anda, mengacu pada versi PHP
5.6.38
,7.2.10
dan7.3.0RC1
( diharapkan 13 Desember 2018 ).Opsi yang
<<option code>>
akan saya uji adalah:$x = array_values(array_slice($array, -1))[0];
( seperti yang disarankan oleh rolacja )$x = array_slice($array, -1)[0];
( seperti yang disarankan oleh Stoutie )$x = array_pop((array_slice($array, -1)));
( seperti yang disarankan oleh rolacja )$x = array_pop((array_slice($array, -1, 1)));
( seperti yang disarankan oleh Westy92 )$x = end($array); reset($array);
( seperti yang disarankan oleh Iznogood )$x = end((array_values($array)));
( seperti yang disarankan oleh TecBrat )$x = $array[count($array)-1];
( seperti yang disarankan oleh Mirko Pagliai )$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
( seperti yang disarankan oleh thrau )$x = $array[] = array_pop($array);
( seperti yang disarankan oleh user2782001 )$x = $array[array_key_last($array)];
( seperti yang disarankan oleh klon Quasimodo ; tersedia per PHP 7.3)(fungsi yang disebutkan: array_key_last , array_keys , array_pop , array_slice , array_values , count , end , reset )
Input tes yang
<<input code>>
akan digabungkan dengan:$array = null;
$array = [];
$array = ["a","b","c",null];
$array = ["a","b","c","d"];
$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }
Untuk pengujian saya akan menggunakan
5.6.38
,7.2.10
dan7.3.0RC1
kontainer PHP docker seperti:Setiap kombinasi dari
<<option code>>
s dan s yang tercantum di<<input code>>
atas akan dijalankan pada semua versi PHP. Untuk setiap tes yang dijalankan, cuplikan kode berikut digunakan:Untuk setiap proses, ini akan var_dump nilai terakhir yang diambil dari input tes dan mencetak durasi rata-rata satu iterasi dalam femtoseconds (0,00000000000000001 per detik).
Hasilnya adalah sebagai berikut:
Yang disebutkan di atas F atal, W eringatan dan N otice Kode diterjemahkan sebagai:
Berdasarkan hasil ini saya menarik kesimpulan sebagai berikut:
$x = end((array_values($array)));
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
$x = end($array); reset($array);
$x = $array[count($array)-1];
$x = $array[] = array_pop($array);
$x = $array[array_key_last($array)];
(sejak PHP 7.3)$x = $array[count($array)-1];
(karena penggunaancount
)$x = $array[] = array_pop($array);
(karena menetapkan nilai kehilangan kunci asli)$x = end($array); reset($array);
$x = end((array_values($array)));
array_key_last
fungsi baru tampaknya tidak memiliki keterbatasan yang disebutkan di atas dengan pengecualian masih menjadi RC pada saat penulisan ini (jadi gunakan RC atau tunggu rilisnya 2018):$x = $array[array_key_last($array)];
(sejak PHP 7.3)Sedikit tergantung pada apakah menggunakan array sebagai stack atau sebagai antrian, Anda dapat membuat variasi pada opsi 9.
sumber
$array[array_key_last($array)];
untuk tolok ukur Anda. Dan tolong beri saya beberapa pemberitahuan ketika selesai. Saya ingin melihat hasil kinerja sebagai perbandingan.Mencoba
Untuk meresetnya (terima kasih @hopeseekr):
Tautan ke manual
@ David Murdoch menambahkan:
$myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
Pada E_STRICT ini menghasilkan peringatanTerima kasih o_O Tync dan semuanya!
sumber
$myLastElement = end(array_values($yourArray));
dan sekarang Anda tidak perlu meneleponreset()
.end(array_values())
akan memberikan E_STRICT: "Hanya variabel yang harus dilewatkan dengan referensi"end((array_values($yourArray)))
Pendek dan manis.
Saya datang dengan solusi untuk menghapus pesan kesalahan dan mempertahankan bentuk satu-liner dan kinerja yang efisien:
- solusi sebelumnya
Catatan: Tanda kurung tambahan diperlukan untuk menghindari a
PHP Strict standards: Only variables should be passed by reference
.sumber
$array = array_slice($array, -1); $lastEl = array_pop($array);
Secara pribadi saya pikir ini lebih baik (tanpa 'bug' parser)array_size() > 1
2. Periksa apakah array sebenarnya adalah array. Saya masih berpegang pada jawaban oleh @Iznogood karenaend()
fungsi built-in PHP sudah melakukan semua kerja keras dengan cara yang lebih efisien.Ada apa dengan ini
array_slice($array, -1)
? (Lihat Manual: http://us1.php.net/array_slice )array_slice()
mengembalikan array. Mungkin bukan yang Anda cari. Anda menginginkan elemen.sumber
array_slice($array, -1)[0]
untuk mendapatkan elemen.reset(array_slice($array, -1))
adalah pendekatan lain (yang tidak akan menyebabkan kesalahan jikaarray_slice()
mengembalikan sesuatu yang "lebih kecil" dari satu elemen array)array_slice($array, -1)[0] = "";
Salah satu cara untuk menghindari kesalahan pass-by-reference (mis. "End (array_values ($ foo))") adalah dengan menggunakan call_user_func atau call_user_func_array:
sumber
end((array_values($yourArray)))
call_user_func
triknya juga tidak berfungsi di PHP 7. Saya pikir Anda terjebak dengan membuat variabel sementara.Jika Anda tidak peduli tentang memodifikasi pointer internal (mendukung array yang diindeks dan asosiatif):
Jika Anda menginginkan fungsi utilitas yang tidak mengubah pointer internal (karena array dilewatkan oleh nilai, dan fungsi beroperasi pada salinannya):
Perhatikan bahwa PHP menghasilkan salinan "on-the-fly", yaitu hanya ketika benar-benar dibutuhkan. Itu
end()
sendiri memodifikasi array, sehingga secara internal salinan array dihasilkan.Jadi, alternatif berikut ini sebenarnya lebih cepat karena secara internal tidak menyalin array, itu hanya membuat irisan:
Ini "foreach / return" adalah tweak untuk secara efisien mendapatkan item pertama (dan di sini tunggal).
Akhirnya, alternatif tercepat tetapi hanya untuk array yang diindeks:
Sebagai catatan, inilah jawaban saya yang lain , untuk elemen pertama array.
sumber
array_last
fungsi. Untuk yang pertama, Anda menyatakan bahwa yang$array
disalin dan yang kedua yang tidak disalin. Di mana perbedaan / mengapa itu disalin dalam implementasi pertama dan bukan pada yang kedua?belum diuji: bukankah ini akan berhasil?
Karena array yang dikembalikan oleh array_values cepat, tidak ada yang peduli jika pointernya diatur ulang.
dan jika Anda memerlukan kunci untuk menggunakannya, saya kira Anda akan melakukannya:
sumber
Saya perlu ini cukup sering untuk berurusan dengan tumpukan, dan saya selalu merasa bingung bahwa tidak ada fungsi asli yang melakukannya tanpa memanipulasi array atau pointer internal dalam beberapa bentuk.
Jadi saya biasanya membawa fungsi util yang juga aman untuk digunakan pada array asosiatif.
sumber
Untuk mendapatkan elemen terakhir dari sebuah array, gunakan:
Tolok ukur
Saya mengulangi 1.000 kali, meraih elemen terakhir dari array kecil dan besar yang masing-masing berisi 100 dan 50.000 elemen.
Saya menggunakan PHP Versi 5.5.32.
sumber
end () akan memberikan elemen terakhir dari sebuah array
sumber
Pada PHP versi 7.3 fungsi
array_key_first
danarray_key_last
telah diperkenalkan.Karena array dalam PHP bukan tipe array yang ketat, yaitu koleksi berukuran tetap bidang berukuran tetap mulai dari indeks 0, tetapi array asosiatif diperpanjang secara dinamis, penanganan posisi dengan kunci yang tidak diketahui sulit dan penyelesaiannya tidak berkinerja baik. Sebaliknya array nyata akan ditangani secara internal melalui pointer arithmethics dengan sangat cepat dan indeks terakhir sudah diketahui pada saat kompilasi oleh deklarasi.
Setidaknya masalah dengan posisi pertama dan terakhir diselesaikan oleh fungsi builtin sekarang sejak versi 7.3. Ini bahkan berfungsi tanpa peringatan pada literal array di luar kotak:
Jelas yang terakhir nilai adalah:
sumber
Tidak ada modifikasi yang dilakukan pada $ array pointer. Ini menghindari
yang mungkin tidak diinginkan dalam kondisi tertentu.
sumber
Untuk saya:
Dengan asosiatif:
sumber
Jawaban teratasnya bagus, tetapi seperti yang disebutkan oleh @ paul-van-leeuwen dan @ quasimodos-clone, PHP 7.3 akan memperkenalkan dua fungsi baru untuk menyelesaikan masalah ini secara langsung - array_key_first () dan array_key_last () .
Anda dapat mulai menggunakan sintaks ini hari ini dengan fungsi polyfill (atau shim) berikut.
Peringatan: Ini membutuhkan PHP 5.4 atau lebih tinggi.
sumber
Untuk melakukan ini dan menghindari E_STRICT dan tidak mengacaukan dengan pointer internal array yang dapat Anda gunakan:
lelement hanya berfungsi dengan salinan sehingga tidak mempengaruhi pointer array.
sumber
Solusi lain:
sumber
Satu lagi solusi yang mungkin ...
sumber
Bagaimana tentang:
$array == []
(kembalifalse
)sumber
Anda akan mendapatkan elemen terakhir dari array dengan mudah menggunakan logika di bawah ini
Tidak hanya elemen terakhir tetapi Anda juga bisa mendapatkan kedua terakhir, ketiga terakhir dan seterusnya dengan menggunakan logika di bawah ini.
untuk elemen terakhir kedua Anda harus melewati angka 2 saja dalam pernyataan di atas misalnya:
echo ($ array [count ($ array) -2]));
sumber
Untuk mendapatkan nilai terakhir dari Array:
Untuk Menghapus array formulir nilai terakhir:
sumber
array_slice($arr,-1,1)
akan menghasilkan array lain dengan panjang 1, bukan elemen terakhir$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-1,1));
Hasil:Array ( [0] => brown )
Secara sederhana:
$last_element = end((array_values($array)))
Tidak mengatur ulang array dan tidak memberikan peringatan STRICT.
PS. Karena jawaban yang paling banyak dipilih masih belum memiliki tanda kurung ganda, saya mengirimkan jawaban ini.
sumber
Saya pikir ini sedikit perbaikan pada semua jawaban yang ada:
end()
atau menggunakan solusiarray_keys()
, terutama dengan array besarsumber
array_values
pada irisan elemen tunggal)Gunakan fungsi end ().
sumber
Saat ini, saya lebih suka selalu memiliki pembantu ini, seperti yang disarankan di jawaban php.net/end .
Ini akan selalu membuat pointer seperti itu dan kita tidak akan pernah perlu khawatir tentang tanda kurung, standar ketat atau apa pun.
sumber
Catatan: Untuk (PHP 7> = 7.3.0) kita dapat menggunakan array_key_last - Mendapat kunci terakhir dari array
Ref: http://php.net/manual/en/function.array-key-last.php
sumber
Bagaimana jika Anda ingin mendapatkan elemen terakhir dari array di dalam loop dari array itu?
Kode di bawah ini akan menghasilkan loop tak terhingga:
Solusinya jelas sederhana untuk array non asosiatif:
sumber
sumber
Pada PHP 7.3,
array_key_last
tersediasumber
Sangat sederhana
sumber
$a = array(); $a[2] = 'c'; $a[1] = 'b'; echo end($a);
akan kembalib
solusi sederhana saya, cantik dan mudah dimengerti.
sumber