问题很简单。 我的代码中有一个foreach循环:

foreach($array as $element) {//code
}

在这个循环中,我想在第一次或最后一次迭代时做出不同的反应。

这该怎么做?


#1楼

你可以用一个柜台:

$i = 0;
$len = count($array);
foreach ($array as $item) {if ($i == 0) {// first} else if ($i == $len - 1) {// last}// …$i++;
}

#2楼

您可以从阵列中删除第一个和最后一个元素并单独处理它们。
像这样:

<?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
?>

删除所有格式设置为CSS而不是内联标记将改善您的代码并加快加载时间。

您也可以尽可能避免将HTML与PHP逻辑混合使用。
通过分离这样的事情,您的页面可以更具可读性和可维护性:

<?php
function create_menu($params) {//retirive 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
}
?>

#3楼

1:为什么不使用简单for声明? 假设您使用的是真实数组而不是Iterator您可以轻松检查计数器变量是0还是小于整数个元素。 在我看来,这是最干净,最容易理解的解决方案......

$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:您应该考虑使用嵌套集来存储树结构。 此外,您可以使用递归函数来改进整个过程。


#4楼

最佳答案:

$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";}

#5楼

为了找到最后一项,我发现这段代码每次都有效:

foreach( $items as $item ) {if( !next( $items ) ) {echo 'Last Item';}
}

#6楼

尝试找到第一个将是:

$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}
}

#7楼

使用键和值也可以:

foreach ($array as $key => $value) {if ($value === end($array)) {echo "LAST ELEMENT!";}
}

#8楼

不确定是否还有必要。 但是以下解决方案应该与迭代器一起使用,并且不需要count

<?phpforeach_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;}}
}

#9楼

使用布尔变量仍然是最可靠的,即使你想检查$value的第一个外观(我发现它在我的情况和许多情况下更有用) ,如下所示:

$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';}
}

然后怎么样!next( $array )找到最后的$value ,如果没有next()值要迭代,它将返回true

如果我打算使用计数器,我更喜欢使用for循环而不是foreach ,如下所示:

$len = count( $array );
for ( $i = 0; $i < $len; $i++ ) {$value = $array[$i];if ($i === 0) {// first} elseif ( $i === $len - 1 ) {// last}// …$i++;
}

#10楼

这很有效!

// Set the array pointer to the last key
end($array);
// Store the last key
$lastkey = key($array);
foreach($array as $key => $element) {....do array stuffif ($lastkey === key($array))echo 'THE LAST ELEMENT! '.$array[$lastkey];
}

感谢@billynoah为您解决最终问题。


#11楼

foreach不同,@ morg中最有效的答案仅适用于正确的数组,而不适用于哈希映射对象。 这个答案避免了循环的每次迭代的条件语句的开销,就像在大多数这些答案(包括接受的答案)中一样,通过专门处理第一个和最后一个元素,并循环中间元素。

array_keys函数可用于使高效的答案像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++;

我还没有对此进行基准测试,但是没有逻辑添加到循环中,这是性能发生的最大打击,所以我怀疑提供高效答案的基准非常接近。

如果你想要实现这种功能 ,我已经在这里使用了一个这样的iterateList函数 。 虽然,如果你非常关注效率,你可能想要对gist代码进行基准测试。 我不确定所有函数调用引入了多少开销。


#12楼

当我遇到同样的问题时,我遇到了这个帖子。 我只需要获取第一个元素然后重新分析我的代码,直到我想到这一点。

$firstElement = true;foreach ($reportData->result() as $row)
{if($firstElement) { echo "first element"; $firstElement=false; }// Other lines of codes here
}

上面的代码非常完整,但如果您只需要第一个元素,那么您可以尝试使用此代码。


#13楼

上面的更简化版本并假设您没有使用自定义索引...

$len = count($array);
foreach ($array as $index => $item) {if ($index == 0) {// first} else if ($index == $len - 1) {// last}
}

版本2 - 因为除非必要,否则我不厌其烦地使用别人。

$len = count($array);
foreach ($array as $index => $item) {if ($index == 0) {// first// do somethingcontinue;}if ($index == $len - 1) {// last// do somethingcontinue;}
}

#14楼

您也可以使用匿名函数:

$indexOfLastElement = count($array) - 1;
array_walk($array, function($element, $index) use ($indexOfLastElement) {// do somethingif (0 === $index) {// first element‘s treatment}if ($indexOfLastElement === $index) {// last not least}
});

还应该提到三件事:

  • 如果您的数组没有严格(数字)索引,则必须首先通过array_values管道数组。
  • 如果你需要修改$element你必须通过引用传递它( &$element )。
  • 你需要在匿名函数之外的任何变量,你必须在use构造中的$indexOfLastElement旁边列出它们,如果需要,再次通过引用。

#15楼

您可以使用计数器和数组长度。

$array = array(1,2,3,4);$i = 0;$len = count($array);foreach ($array as $item) {if ($i === 0) {// first} else if ($i === $len - 1) {// last}// …$i++;}

#16楼

对于SQL查询生成脚本,或对第一个或最后一个元素执行不同操作的任何内容,它要快得多(几乎快两倍)以避免使用不必要的变量检查。

当前接受的解决方案在循环内使用循环和检查every_single_iteration,正确(快速)方式执行此操作如下:

$numItems = count($arr);
$i=0;
$firstitem=$arr[0];
$i++;
while($i<$numItems-1){$some_item=$arr[$i];$i++;
}
$last_item=$arr[$i];
$i++;

一个小的自制基准显示如下:

test1:模型morg的100000次运行

时间:1869.3430423737毫秒

test2:如果最后一次运行100000次模型

时间:3235.6359958649毫秒

因此很明显,检查费用很高,当然,你添加的检查变量越多,情况就越糟糕;)


#17楼

如果您更喜欢不需要在循环外部初始化计数器的解决方案,我建议将当前迭代键与告诉您数组的最后/第一个键的函数进行比较。

即将推出的PHP 7.3,这会变得更有效(并且更具可读性)。

PHP 7.3及更高版本的解决方案:

foreach($array as $key => $element) {if ($key === array_key_first($array))echo 'FIRST ELEMENT!';if ($key === array_key_last($array))echo 'LAST ELEMENT!';
}

所有PHP版本的解决方案:

foreach($array as $key => $element) {reset($array);if ($key === key($array))echo 'FIRST ELEMENT!';end($array);if ($key === key($array))echo 'LAST ELEMENT!';
}

#18楼

试试这个:

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);

如何确定foreach循环中的第一次和最后一次迭代?相关推荐

  1. foreach输出mysql方法_mysql – “foreach”循环:使用R中的所有核心(特别是如果我们在foreach循环中发送sql查询)...

    我打算用"foreach"来uitlize我的CPU中的所有核心.我需要在循环中发送一个sql查询.该脚本在正常的'for'循环中工作正常,但是当我将其更改为'foreach'时它 ...

  2. 在Java中的foreach循环中调用remove

    本文翻译自:Calling remove in foreach loop in Java [duplicate] This question already has an answer here: 这 ...

  3. java for循环 等待_在forEach循环中使用异步/等待

    在forEach循环中使用async / await是否有任何问题? 我正在尝试遍历文件数组并await每个文件的内容. import fs from 'fs-promise' async funct ...

  4. forEach循环中异步操作的问题

    文章目录 需求: 问题: forEach: 问题代码: 解决方案: 方案一:使用`for...of`循环 方案二:使用`for`循环 方案三:使用`Promise.all()`+`map` 需求: 想 ...

  5. PHP for循环中的sql语句,php – 在foreach循环中使用SQL结果

    我觉得我错过了一些愚蠢明显的东西,我试图获得SQL查询的结果,然后在循环中使用它们.我觉得我错过了一些愚蠢明显的东西,我已经尝试过,有没有注释掉的线. $sentToID = $_SESSION['u ...

  6. php foreach循环中的变量

    使用foreach的时候出现了一个奇怪的现象,其中一个数组变量的最后一个值莫名其妙被修改了,查看php手册foreach说明发现 Warning 数组最后一个元素的 $value 引用在 foreac ...

  7. php for循环逗号,关于php:从foreach循环中删除最后一个逗号

    我使用foreach循环从数据库中回显一些值,如果这有意义的话,我需要从最后一个循环中去掉最后一个逗号. 我的循环很简单,如下所示 foreach($results as $result){ echo ...

  8. php数组foreach循环添加键值对_在PHP的foreach循环中插入一个$key作为变量

    我有这个数组: $lista_agregados = array('po' => '0', 'brita' => '0'); 而这些数组: $po = array(0 => arra ...

  9. php循环分页,如何使用PHP在foreach循环中对行进行分页

    使用以下代码显示我的Twitter个人资料中的朋友列表.我想一次只加载一个特定的数字,例如20,然后在底部为第1-2-3-4-5页的页面提供分页链接(但是,除以限制) $xml = simplexml ...

最新文章

  1. linux中offsetof与container_of宏定义
  2. 前端月趋势榜:5 月最热门的 20 个前端开源项目 - 2105
  3. mysql 事件计划区别_MySQL 计划事件
  4. 测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2
  5. 前端学习(2179):vue-router-router的由来和vue-router
  6. mysql中有sa_SA工作-mysql设计规范
  7. 码农心目中的高富帅甲骨文公司在走下坡路
  8. 矩阵分析 (八) 矩阵的直积
  9. Django积木块11 —— 缓存
  10. 以客户的名义,宏杉科技“存储七项式”律己律人
  11. RGMII接口(KSZ9031)
  12. python代码写龙卷风_python - 龙卷风服务器二进制可执行文件
  13. 基于区域生长算法的图像分割python_基于区域分割(图像分割)
  14. fast无线路由器设置服务器,Fast迅捷无线路由器怎么设置 Fast迅捷无线路由器设置方法【详细步骤】...
  15. 窗口最大化最大最小化关闭按钮超出屏幕 WM_GETMINMAXINFO
  16. 软件工程如何选择方向
  17. unity+google cardboard
  18. 你们程序员为什么不靠自己的项目谋生?而必须为其他人打工?
  19. 「翻译」一个成功的 Git 分支模型
  20. CSS控制鼠标光标样式

热门文章

  1. Android面试题目之六---Handler,Looper和MessageQueue深入研究
  2. Kotlin特色之object、let、with、run、apply、also函数的使用
  3. python代码转换为pytorch_python、PyTorch图像读取与numpy转换
  4. 写给那些在技术路上奔跑的人们!!!!!
  5. swift_021(Swift 的方法)
  6. uniapp中遮罩穿透问题
  7. Python一行代码实现快速排序
  8. 使用Tensoflow实现梯度下降算法的一次线性拟合
  9. Linux c基本知识整理
  10. BZOJ 2287 【POJ Challenge】消失之物