Saya menulis pembuat kueri SQL menggunakan beberapa parameter. Di Jawa, sangat mudah untuk mendeteksi elemen terakhir dari array dari dalam for loop dengan hanya memeriksa posisi array saat ini dengan panjang array.
for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}
Di PHP mereka memiliki indeks non-integer untuk mengakses array. Jadi, Anda harus mengulangi array menggunakan foreach loop. Ini menjadi bermasalah ketika Anda perlu mengambil beberapa keputusan (dalam kasus saya untuk menambahkan atau / dan parameter saat membangun kueri).
Saya yakin pasti ada cara standar untuk melakukan ini.
Bagaimana Anda mengatasinya dalam PHP?
Jawaban:
Sepertinya Anda menginginkan sesuatu seperti ini:
Yang sedang berkata, Anda tidak -memiliki iterate atas "array" menggunakan
foreach
di php.sumber
$numItems = count($arr)
trik tidak diperlukan dan mengurangi keterbacaan - dalam PHP tidak ada penalti kinerja untuk mengakses hitungan ($ arr) setiap kali. Alasannya adalah bahwa jumlah item disimpan secara internal sebagai bidang khusus di header array dan tidak dihitung saat itu juga. Trik ini berasal dari bahasa lain (C, Java?, ...).Anda bisa mendapatkan nilai kunci terakhir dari array menggunakan
end(array_keys($array))
dan membandingkannya dengan kunci saat ini:sumber
$lastKey = array_search(end($array), $array);
mengapa begitu rumit?
Ini akan menambahkan, di balik setiap nilai kecuali yang terakhir!
sumber
Ketika toEnd mencapai 0 itu berarti ia berada pada iterasi terakhir dari loop.
Nilai terakhir masih tersedia setelah loop, jadi jika Anda hanya ingin menggunakannya untuk lebih banyak barang setelah loop ini lebih baik:
Jika Anda tidak ingin memperlakukan nilai terakhir sebagai loop dalam khusus. Ini harus lebih cepat jika Anda memiliki array yang besar. (Jika Anda menggunakan kembali array setelah loop di dalam ruang lingkup yang sama Anda harus "menyalin" array terlebih dahulu).
Dan untuk menjawab pertanyaan awal Anda "dalam kasus saya untuk menambahkan atau / dan parameter sambil membangun kueri"; ini akan mengulang semua nilai, kemudian bergabung bersama-sama ke string dengan "dan" di antara mereka tetapi tidak sebelum nilai pertama atau setelah nilai terakhir:
sumber
$lastValue = array_pop($array);
Terima kasih.Sudah ada banyak jawaban, tetapi ada baiknya untuk melihat iterator juga, terutama karena telah diminta cara standar:
Anda mungkin menemukan sesuatu yang berfungsi lebih fleksibel untuk kasus lain juga.
sumber
i=0;
dan++i;
selalu tampak seperti hacker dalam bahasa scripting seperti PHP.Salah satu caranya adalah mendeteksi apakah iterator memilikinya
next
. Jika tidak ada berikutnya yang melekat pada iterator itu berarti Anda berada di loop terakhir.sumber
Jadi, jika array Anda memiliki nilai array unik, maka menentukan iterasi terakhir adalah sepele:
Seperti yang Anda lihat, ini berfungsi jika elemen terakhir hanya muncul sekali dalam array, jika tidak, Anda akan mendapatkan alarm palsu. Di dalamnya tidak, Anda harus membandingkan kunci (yang unik pasti).
Perhatikan juga operator coparision yang ketat, yang cukup penting dalam kasus ini.
sumber
Asumsikan Anda memiliki array yang disimpan dalam variabel ...
sumber
untuk mendapatkan elemen pertama dan terakhir dari foreach array
sumber
Anda masih dapat menggunakan metode itu dengan array asosiatif:
sumber
Jika Anda perlu melakukan sesuatu untuk setiap elemen kecuali yang pertama atau yang terakhir dan hanya jika ada lebih dari satu elemen dalam array, saya lebih suka solusi berikut.
Saya tahu ada banyak solusi di atas dan diposting bulan / satu tahun sebelum saya, tetapi ini adalah sesuatu yang saya rasa cukup elegan. Periksa setiap loop juga merupakan cek boolean yang berlawanan dengan cek "i = (count-1)" numerik, yang memungkinkan lebih sedikit overhead.
Struktur loop mungkin terasa aneh, tetapi Anda dapat membandingkannya dengan urutan thead (awal), tfoot (end), tbody (current) dalam tag tabel HTML.
Misalnya, dalam istilah pengembangan web, jika Anda ingin menambahkan border-bottom ke setiap elemen kecuali yang terakhir di daftar tidak berurutan (ul), maka Anda bisa menambahkan border-top ke setiap elemen kecuali yang pertama (CSS: anak pertama, didukung oleh IE7 + dan Firefox / Webkit mendukung logika ini, sedangkan: anak terakhir tidak didukung oleh IE7).
Anda dapat merasa bebas untuk menggunakan kembali variabel $ first untuk masing-masing dan setiap loop bersarang juga dan semuanya akan berfungsi dengan baik karena setiap loop membuat $ first false selama proses pertama dari iterasi pertama (sehingga istirahat / pengecualian tidak akan menyebabkan masalah) .
Contoh output:
sumber
Ini harus menjadi cara mudah untuk menemukan elemen terakhir:
Referensi: Tautan
sumber
Saya memiliki perasaan yang kuat bahwa pada akar dari "masalah XY" OP ini hanya ingin
implode()
berfungsi.sumber
Karena niat Anda menemukan array EOF hanya untuk lem. Kenali taktik di bawah ini. Anda tidak perlu meminta EOF:
o / p:
sumber
Bagaimana kalau menggunakan "end"? http://php.net/manual/en/function.end.php
sumber
Sepertinya Anda menginginkan sesuatu seperti ini:
sumber
Jangan tambahkan koma setelah nilai terakhir:
Array:
Fungsi:
Hasil:
lorem, ipsum, dolor, sit, amet
sumber
Anda dapat melakukan hitungan ().
atau jika Anda HANYA mencari elemen terakhir, Anda bisa menggunakan end ().
mengembalikan hanya elemen terakhir.
dan, ternyata, Anda BISA mengindeks array php dengan bilangan bulat. Sangat senang dengan itu
sumber
$a = array(0=>'A', 2=>'B', 'aaa'=>'C')
. Apa yang Anda dapatkan jika Anda mengakses$a[count($a)-1]
?Anda juga dapat melakukan sesuatu seperti ini:
sumber
Saya agak suka yang berikut ini karena saya merasa cukup rapi. Mari kita asumsikan kita sedang membuat string dengan pemisah antara semua elemen: misalnya a, b, c
sumber
Referensi
sumber
Berikut cara lain untuk melakukannya:
sumber
Jika saya mengerti Anda, maka yang Anda butuhkan adalah membalikkan array dan mendapatkan elemen terakhir dengan perintah pop:
sumber
Anda juga dapat mencoba ini untuk membuat kueri Anda ... ditampilkan di sini dengan INSERT
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
sumber
Cara lain adalah mengingat hasil siklus putaran sebelumnya dan menggunakannya sebagai hasil akhir:
sumber
Saya pribadi menggunakan jenis konstruksi ini yang memungkinkan penggunaan yang mudah dengan elemen html <ul> dan <li>: cukup ubah kesetaraan untuk properti lain ...
Array tidak dapat berisi item palsu tetapi semua item lainnya yang dilemparkan ke dalam boolean palsu.
sumber
Anda dapat secara langsung mendapatkan indeks terakhir dengan:
$numItems = count($arr);
echo $arr[$numItems-1];
sumber
sumber
Inilah solusi saya: Cukup hitung jumlah array Anda, minus 1 (sejak mereka mulai 0).
sumber