Jawaban:
Anda bisa menggunakan penghitung:
$i = 0;
$len = count($array);
foreach ($array as $item) {
if ($i == 0) {
// first
} else if ($i == $len - 1) {
// last
}
// …
$i++;
}
$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.
foreach($array as $key => $element) {
if ($key === array_key_first($array))
echo 'FIRST ELEMENT!';
if ($key === array_key_last($array))
echo 'LAST ELEMENT!';
}
foreach($array as $key => $element) {
reset($array);
if ($key === key($array))
echo 'FIRST ELEMENT!';
end($array);
if ($key === key($array))
echo 'LAST ELEMENT!';
}
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 menentukan reset()
dan end()
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:
foreach( $items as $item ) {
if( !next( $items ) ) {
echo 'Last Item';
}
}
[true,true,false,true]
. Tetapi secara pribadi saya akan menggunakan ini kapan saja saya berurusan dengan array yang tidak mengandung boolean false
.
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 ...
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
} else if ($index == $len - 1) {
// last
}
}
Versi 2 - Karena saya telah membenci menggunakan yang lain kecuali diperlukan.
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
// do something
continue;
}
if ($index == $len - 1) {
// last
// do something
continue;
}
}
if ($index == count($array) - 1)
. Lihat di sini .
Anda bisa menghapus elemen pertama dan terakhir dari array dan memprosesnya secara terpisah.
Seperti ini:
<?php
$array = something();
$first = array_shift($array);
$last = array_pop($array);
// do something with $first
foreach ($array as $item) {
// do something with $item
}
// do something with $last
?>
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:
<?php
function create_menu($params) {
//retrieve menu items
//get collection
$collection = get('xxcollection') ;
foreach($collection as $c) show_collection($c);
}
function show_subcat($val) {
?>
<div class="sub_node" style="display:none">
<img src="../images/dtree/join.gif" align="absmiddle" style="padding-left:2px;" />
<a id="'.$val['xsubcatid'].'" href="javascript:void(0)" onclick="getProduct(this , event)" class="sub_node_links" >
<?php echo $val['xsubcatname']; ?>
</a>
</div>
<?php
}
function show_cat($item) {
?>
<div class="node" >
<img src="../images/dtree/plus.gif" align="absmiddle" class="node_item" id="plus" />
<img src="../images/dtree/folder.gif" align="absmiddle" id="folder">
<?php echo $item['xcatname']; ?>
<?php
$subcat = get_where('xxsubcategory' , array('xcatid'=>$item['xcatid'])) ;
foreach($subcat as $val) show_subcat($val);
?>
</div>
<?php
}
function show_collection($c) {
?>
<div class="parent" style="direction:rtl">
<img src="../images/dtree/minus.gif" align="absmiddle" class="parent_item" id="minus" />
<img src="../images/dtree/base.gif" align="absmiddle" id="base">
<?php echo $c['xcollectionname']; ?>
<?php
//get categories
$cat = get_where('xxcategory' , array('xcollectionid'=>$c['xcollectionid']));
foreach($cat as $item) show_cat($item);
?>
</div>
<?php
}
?>
Upaya untuk menemukan yang pertama adalah:
$first = true;
foreach ( $obj as $value )
{
if ( $first )
{
// do something
$first = false; //in order not to get into the if statement for the next loops
}
else
{
// do something else for all loops except the first
}
}
Cukup ini berhasil!
// Set the array pointer to the last key
end($array);
// Store the last key
$lastkey = key($array);
foreach($array as $key => $element) {
....do array stuff
if ($lastkey === key($array))
echo 'THE LAST ELEMENT! '.$array[$lastkey];
}
Terima kasih @billynoah untuk Anda memilah-milah masalah akhir .
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, bukan end()
. end()
" mengembalikan nilai elemen terakhir ", dan key()
mengharapkan array sebagai input.
1: Mengapa tidak menggunakan for
pernyataan sederhana ? Dengan asumsi Anda menggunakan array nyata dan bukan Iterator
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 ...
$array = array( ... );
$count = count( $array );
for ( $i = 0; $i < $count; $i++ )
{
$current = $array[ $i ];
if ( $i == 0 )
{
// process first element
}
if ( $i == $count - 1 )
{
// process last element
}
}
2: Anda harus mempertimbangkan untuk menggunakan Nested Sets untuk menyimpan struktur pohon Anda. Selain itu Anda dapat meningkatkan semuanya dengan menggunakan fungsi rekursif.
for
Anda dapat loop dari 1
ke n-1
dan mengambil if
s keluar dari tubuh. Tidak ada gunanya memeriksanya berulang kali.
Jawaban Terbaik:
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
foreach ($arr as $a) {
// This is the line that does the checking
if (!each($arr)) echo "End!\n";
echo $a."\n";
}
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 seperti foreach
:
$keys = array_keys($arr);
$numItems = count($keys);
$i=0;
$firstItem=$arr[$keys[0]];
# Special handling of the first item goes here
$i++;
while($i<$numItems-1){
$item=$arr[$keys[$i]];
# Handling of regular items
$i++;
}
$lastItem=$arr[$keys[$i]];
# Special handling of the last item goes here
$i++;
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.
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:
$numItems = count($arr);
$i=0;
$firstitem=$arr[0];
$i++;
while($i<$numItems-1){
$some_item=$arr[$i];
$i++;
}
$last_item=$arr[$i];
$i++;
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;)
$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:
foreach ($array as $key => $value) {
if ($value === end($array)) {
echo "LAST ELEMENT!";
}
}
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:
$is_first = true;
foreach( $array as $value ) {
switch ( $value ) {
case 'match':
echo 'appeared';
if ( $is_first ) {
echo 'first appearance';
$is_first = false;
}
break;
}
}
if( !next( $array ) ) {
echo 'last value';
}
}
Lalu bagaimana !next( $array )
menemukan yang terakhir $value
yang akan kembali true
jika tidak ada next()
nilai untuk beralih.
Dan saya lebih suka menggunakan for
loop daripada foreach
jika saya akan menggunakan penghitung, seperti ini:
$len = count( $array );
for ( $i = 0; $i < $len; $i++ ) {
$value = $array[$i];
if ($i === 0) {
// first
} elseif ( $i === $len - 1 ) {
// last
}
// …
$i++;
}
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.
$firstElement = true;
foreach ($reportData->result() as $row)
{
if($firstElement) { echo "first element"; $firstElement=false; }
// Other lines of codes here
}
Kode di atas bagus dan lengkap tetapi jika Anda hanya perlu elemen pertama maka Anda dapat mencoba kode ini.
Tidak yakin apakah itu masih perlu. Tetapi solusi berikut harus bekerja dengan iterator dan tidak memerlukan count
.
<?php
foreach_first_last(array(), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
foreach_first_last(array('aa'), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;
foreach_first_last(array('aa', 'bb', 'cc'), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;
function foreach_first_last($array, $cb)
{
$next = false;
$current = false;
reset($array);
for ($step = 0; true; ++$step) {
$current = $next;
$next = each($array);
$last = ($next === false || $next === null);
if ($step > 0) {
$first = $step == 1;
list ($key, $value) = $current;
if (call_user_func($cb, $key, $value, $step, $first, $last) === false) {
break;
}
}
if ($last) {
break;
}
}
}
Anda juga dapat menggunakan fungsi anonim:
$indexOfLastElement = count($array) - 1;
array_walk($array, function($element, $index) use ($indexOfLastElement) {
// do something
if (0 === $index) {
// first element‘s treatment
}
if ($indexOfLastElement === $index) {
// last not least
}
});
Tiga hal lagi harus disebutkan:
array_values
terlebih dahulu.$element
Anda harus meneruskannya dengan referensi ( &$element
).$indexOfLastElement
dalam use
konstruk, lagi dengan referensi jika diperlukan.Anda dapat menggunakan penghitung dan panjang array.
$ array = array (1,2,3,4); $ i = 0; $ len = count ($ array); foreach ($ array sebagai $ item) { if ($ i === 0) { // pertama } lain jika ($ i === $ len - 1) { // terakhir } // ... $ i ++; }
foreach ($arquivos as $key => $item) {
reset($arquivos);
// FIRST AHEAD
if ($key === key($arquivos) || $key !== end(array_keys($arquivos)))
$pdf->cat(null, null, $key);
// LAST
if ($key === end(array_keys($arquivos))) {
$pdf->cat(null, null, $key)
->execute();
}
}
Menggunakan reset ($ array) dan end ($ array)
<?php
$arrays = [1,2,3,4,5];
$first = reset($arrays);
$last = end($arrays);
foreach( $arrays as $array )
{
if ( $first == $array )
{
echo "<li>{$array} first</li>";
}
else if ( $last == $array )
{
echo "<li>{$array} last</li>";
}
else
{
echo "<li>{$array}</li>";
}
}
Coba ini:
function children( &$parents, $parent, $selected ){
if ($parents[$parent]){
$list = '<ul>';
$counter = count($parents[$parent]);
$class = array('first');
foreach ($parents[$parent] as $child){
if ($child['id'] == $selected) $class[] = 'active';
if (!--$counter) $class[] = 'last';
$list .= '<li class="' . implode(' ', $class) . '"><div><a href="]?id=' . $child['id'] . '" alt="' . $child['name'] . '">' . $child['name'] . '</a></div></li>';
$class = array();
$list .= children($parents, $child['id'], $selected);
}
$list .= '</ul>';
return $list;
}
}
$output .= children( $parents, 0, $p_industry_id);
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.