meh*_*hdi 466 php foreach loops
问题很简单.foreach我的代码中有一个循环:
foreach($array as $element) {
//code
}
Run Code Online (Sandbox Code Playgroud)
在这个循环中,我想在第一次或最后一次迭代时做出不同的反应.
这该怎么做?
Rok*_*alj 963
如果您更喜欢不需要在循环外部初始化计数器的解决方案,我建议将当前迭代键与告诉您数组的最后/第一个键的函数进行比较.
即将推出的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!';
}
Run Code Online (Sandbox Code Playgroud)
foreach($array as $key => $element) {
reset($array);
if ($key === key($array))
echo 'FIRST ELEMENT!';
end($array);
if ($key === key($array))
echo 'LAST ELEMENT!';
}
Run Code Online (Sandbox Code Playgroud)
Gum*_*mbo 406
你可以用一个柜台:
$i = 0;
$len = count($array);
foreach ($array as $item) {
if ($i == 0) {
// first
} else if ($i == $len - 1) {
// last
}
// …
$i++;
}
Run Code Online (Sandbox Code Playgroud)
小智 116
为了找到最后一项,我发现这段代码每次都有效:
foreach( $items as $item ) {
if( !next( $items ) ) {
echo 'Last Item';
}
}
Run Code Online (Sandbox Code Playgroud)
Hay*_*den 84
上面的更简化版本并假设您没有使用自定义索引...
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
} else if ($index == $len - 1) {
// last
}
}
Run Code Online (Sandbox Code Playgroud)
版本2 - 因为除非必要,否则我不厌其烦地使用别人.
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
// do something
continue;
}
if ($index == $len - 1) {
// last
// do something
continue;
}
}
Run Code Online (Sandbox Code Playgroud)
Car*_*ima 35
您可以从阵列中删除第一个和最后一个元素并单独处理它们.
像这样:
<?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
?>
Run Code Online (Sandbox Code Playgroud)
删除所有格式设置为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
}
?>
Run Code Online (Sandbox Code Playgroud)
Syd*_*ell 18
这很有效!
// 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];
}
Run Code Online (Sandbox Code Playgroud)
感谢@billynoah为您解决最终问题.
sst*_*oss 17
尝试找到第一个将是:
$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
}
}
Run Code Online (Sandbox Code Playgroud)
oko*_*man 11
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
}
}
Run Code Online (Sandbox Code Playgroud)
2:您应该考虑使用嵌套集来存储树结构.此外,您可以使用递归函数来改进整个过程.
最佳答案:
$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";
}
Run Code Online (Sandbox Code Playgroud)
来自@morg 的最有效的答案,不同于foreach,只适用于正确的数组,而不适用于哈希映射对象.这个答案避免了循环的每次迭代的条件语句的开销,就像在大多数这些答案(包括接受的答案)中一样,通过专门处理第一个和最后一个元素,并循环中间元素.
该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++;
Run Code Online (Sandbox Code Playgroud)
我还没有对此进行基准测试,但是没有逻辑添加到循环中,这是性能发生的最大打击,所以我怀疑提供高效答案的基准非常接近.
如果你想要实现这种功能,我已经在这里使用了一个这样的iterateList函数.虽然,如果你非常关注效率,你可能想要对gist代码进行基准测试.我不确定所有函数调用引入了多少开销.
小智 6
对于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++;
Run Code Online (Sandbox Code Playgroud)
一个小的自制基准显示如下:
test1:模型morg的100000次运行
时间:1869.3430423737毫秒
test2:如果最后一次运行100000次模型
时间:3235.6359958649毫秒
因此很明显,检查费用很高,当然,你添加的检查变量越多,情况就越糟糕;)
使用键和值也可以:
foreach ($array as $key => $value) {
if ($value === end($array)) {
echo "LAST ELEMENT!";
}
}
Run Code Online (Sandbox Code Playgroud)
即使您想检查a的初次出现,使用Boolean变量仍然是最可靠的方法$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';
}
}
Run Code Online (Sandbox Code Playgroud)
然后如何!next( $array )找到最后一个值,如果没有值要迭代$value,它将返回该值。truenext()
而且我更喜欢使用for循环而不是foreach如果要使用计数器,例如:
$len = count( $array );
for ( $i = 0; $i < $len; $i++ ) {
$value = $array[$i];
if ($i === 0) {
// first
} elseif ( $i === $len - 1 ) {
// last
}
// …
$i++;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
490683 次 |
| 最近记录: |