Pertanyaannya sederhana. Saya memiliki foreach
loop dalam kode saya:
foreach($array as $element) {
//code
}
Dalam loop ini, saya ingin bereaksi secara berbeda ketika kita berada dalam iterasi pertama atau terakhir.
Bagaimana cara melakukannya?
array_shift
danarray_pop
. Meskipun ini adalah solusi yang saya temukan jika saya harus menerapkan hal seperti itu, saya akan tetap dengan jawaban Rok Kralj sekarang.$i = 1
, Anda tidak perlu khawatir$len - 1
, cukup gunakan$len
.Jika Anda lebih suka solusi yang tidak memerlukan inisialisasi penghitung di luar loop, saya mengusulkan membandingkan kunci iterasi saat ini terhadap fungsi yang memberitahu Anda kunci terakhir / pertama dari array.
Ini menjadi lebih efisien (dan lebih mudah dibaca) dengan PHP 7.3 yang akan datang.
Solusi untuk PHP 7.3 dan lebih tinggi:
Solusi untuk semua versi PHP:
sumber
end()
+key()
atas setiap iterasi dari loop - jika keduanya maka itu 4 metode yang dipanggil setiap waktu. Memang, itu akan menjadi operasi yang sangat ringan dan mungkin hanya penunjuk penunjuk, tetapi kemudian dokumen akan menentukanreset()
danend()
memodifikasi penunjuk internal array - jadi apakah ini lebih cepat daripada penghitung? mungkin juga tidak.reset()
panggilan sebelum pemeriksaan dan cache hasilnya$first
.Untuk menemukan item terakhir, saya menemukan kode ini berfungsi setiap saat:
sumber
next
: Peringatan Fungsi ini dapat mengembalikan BooleanFALSE
, tetapi juga dapat mengembalikan nilai non-Boolean yang dievaluasi menjadiFALSE
. Silakan baca bagian tentang Boolean untuk informasi lebih lanjut. Gunakan===
operator untuk menguji nilai kembali fungsi ini.[true,true,false,true]
. Tetapi secara pribadi saya akan menggunakan ini kapan saja saya berurusan dengan array yang tidak mengandung booleanfalse
.next()
harus TIDAK PERNAH digunakan di dalam foreach loop. Ini mengacaukan pointer array internal. Lihatlah dokumentasi untuk informasi lebih lanjut.Versi yang lebih disederhanakan di atas dan menganggap Anda tidak menggunakan indeks khusus ...
Versi 2 - Karena saya telah membenci menggunakan yang lain kecuali diperlukan.
sumber
if ($index == count($array) - 1)
. Lihat di sini .Anda bisa menghapus elemen pertama dan terakhir dari array dan memprosesnya secara terpisah.
Seperti ini:
Menghapus semua pemformatan ke CSS alih-alih tag inline akan meningkatkan kode Anda dan mempercepat waktu pemuatan.
Anda juga dapat menghindari pencampuran HTML dengan logika php bila memungkinkan.
Halaman Anda dapat dibuat lebih mudah dibaca dan dikelola dengan memisahkan hal-hal seperti ini:
sumber
Upaya untuk menemukan yang pertama adalah:
sumber
Cukup ini berhasil!
Terima kasih @billynoah untuk Anda memilah-milah masalah akhir .
sumber
if ($key === $lastkey)
.if ($lastkey === $key)
?PHP Warning: key() expects parameter 1 to be array, integer given in php shell code on line 1
key()
mendapatkan bilangan bulat, bukanend()
.end()
" mengembalikan nilai elemen terakhir ", dankey()
mengharapkan array sebagai input.1: Mengapa tidak menggunakan
for
pernyataan sederhana ? Dengan asumsi Anda menggunakan array nyata dan bukanIterator
Anda dapat dengan mudah memeriksa apakah variabel penghitung adalah 0 atau kurang dari jumlah seluruh elemen. Menurut pendapat saya ini adalah solusi yang paling bersih dan dapat dimengerti ...2: Anda harus mempertimbangkan untuk menggunakan Nested Sets untuk menyimpan struktur pohon Anda. Selain itu Anda dapat meningkatkan semuanya dengan menggunakan fungsi rekursif.
sumber
for
Anda dapat loop dari1
ken-1
dan mengambilif
s keluar dari tubuh. Tidak ada gunanya memeriksanya berulang kali.Jawaban Terbaik:
sumber
Jawaban paling efisien dari @morg, tidak seperti
foreach
, hanya berfungsi untuk array yang tepat, bukan objek peta hash. Jawaban ini menghindari overhead pernyataan bersyarat untuk setiap iterasi loop, seperti dalam sebagian besar jawaban ini (termasuk jawaban yang diterima) dengan secara khusus menangani elemen pertama dan terakhir, dan pengulangan ke elemen tengah.The
array_keys
fungsi dapat digunakan untuk membuat jawaban kerja yang efisien sepertiforeach
:Saya belum melakukan benchmark pada hal ini, tetapi tidak ada logika yang ditambahkan ke loop, yang merupakan hit terbesar untuk kinerja terjadi, jadi saya menduga bahwa tolok ukur yang diberikan dengan jawaban efisien cukup dekat.
Jika Anda ingin memfungsikan hal semacam ini, saya telah mengambil ayunan fungsi iterateList di sini . Meskipun, Anda mungkin ingin membandingkan kode inti jika Anda sangat memperhatikan efisiensi. Saya tidak yakin berapa banyak overhead semua fungsi yang diperkenalkan doa.
sumber
Untuk skrip pembuatan kueri SQL, atau apa pun yang melakukan tindakan berbeda untuk elemen pertama atau terakhir, itu jauh lebih cepat (hampir dua kali lebih cepat) untuk menghindari menggunakan pemeriksaan variabel yang tidak perlu.
Solusi yang diterima saat ini menggunakan loop dan centang dalam loop yang akan dibuat every_single_iteration, cara (cepat) yang benar untuk melakukan ini adalah sebagai berikut:
Patokan kecil buatan sendiri menunjukkan yang berikut:
test1: 100000 menjalankan model morg
waktu: 1869,3430423737 milidetik
test2: 100000 menjalankan model jika bertahan
waktu: 3235.6359958649 milidetik
Dan dengan demikian cukup jelas bahwa biaya pemeriksaan banyak, dan tentu saja semakin buruk semakin banyak cek variabel yang Anda tambahkan;)
sumber
$arr = array('one' => "1 1 1", 4 => 'Four', 1 => 'One'); $numItems = count($arr); $i=0; $firstitem=$arr[0]; echo $i . ': ' . $firstitem . ", "; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; echo $i . ': ' . $some_item . ", "; $i++; } $last_item=$arr[$i]; echo $i . ': ' . $last_item . ", "; $i++;
akan menampilkan:0: , 1: One, 2: ,
array()
dibuat{'one':"1 1 1",0:"",1:"One",2:"",3:"",4:"Four"}
tetapi elemen kosong diabaikan dengan hitungan, Anda menghitung jumlah "benda" yang ditentukan !! PENGHASILAN PENGORBANAN BOUNTY! Jawaban ini layak mendapat hadiah, tetapi jika @Morg. pergi, tidak ada gunanya. Saya akan memberikan hadiah kepada seseorang yang mungkin tidak akan menggunakan SO lagi! Jika dia kembali dan meningkatkan jawabannya, dia layak mendapatkan hadiah!array_keys
fungsi, yang bisa Anda perlakukan seperti array. Lihat jawaban "ditingkatkan" saya .$querySet = ""; foreach ($fieldSet as $key=>$value) { $value = $db->dbLink->quote($value); $querySet .= "$key = $value, "; } $querySet = substr_replace($querySet, "", -2); $queryString = "UPDATE users SET $querySet WHERE user_ID = '$user_ID'";
Dengan Tombol dan Nilai ini berfungsi juga:
sumber
Menggunakan variabel Boolean masih yang paling dapat diandalkan, bahkan jika Anda ingin memeriksa tampilan pertama dari a
$value
(saya menemukan itu lebih berguna dalam situasi saya dan dalam banyak situasi) , seperti ini:Lalu bagaimana
!next( $array )
menemukan yang terakhir$value
yang akan kembalitrue
jika tidak adanext()
nilai untuk beralih.Dan saya lebih suka menggunakan
for
loop daripadaforeach
jika saya akan menggunakan penghitung, seperti ini:sumber
Saya menemukan utas ini ketika saya memiliki masalah yang sama. Saya hanya perlu mendapatkan elemen pertama kemudian saya menganalisis ulang kode saya sampai ini muncul di pikiran saya.
Kode di atas bagus dan lengkap tetapi jika Anda hanya perlu elemen pertama maka Anda dapat mencoba kode ini.
sumber
Tidak yakin apakah itu masih perlu. Tetapi solusi berikut harus bekerja dengan iterator dan tidak memerlukan
count
.sumber
Anda juga dapat menggunakan fungsi anonim:
Tiga hal lagi harus disebutkan:
array_values
terlebih dahulu.$element
Anda harus meneruskannya dengan referensi (&$element
).$indexOfLastElement
dalamuse
konstruk, lagi dengan referensi jika diperlukan.sumber
Anda dapat menggunakan penghitung dan panjang array.
sumber
sumber
Menggunakan reset ($ array) dan end ($ array)
Demo repl.it
sumber
Coba ini:
sumber