当前位置:  开发笔记 > 编程语言 > 正文

在PHP中使用foreach循环时查找数组的最后一个元素

如何解决《在PHP中使用foreach循环时查找数组的最后一个元素》经验,为你挑选了8个好方法。

我正在使用一些参数编写SQL查询创建器.在Java中,只需使用数组长度检查当前数组位置,就可以非常轻松地从for循环内部检测数组的最后一个元素.

for(int i=0; i< arr.length;i++){
     boolean isLastElem = i== (arr.length -1) ? true : false;        
}

在PHP中,它们具有非整数索引来访问数组.因此,您必须使用foreach循环遍历数组.当你需要做出一些决定时(在我的情况下,在构建查询时附加或/和参数),这就成了问题.

我相信必须有一些标准的方法来做到这一点.

你是如何在PHP中解决这个问题的?



1> Richard Leva..:

听起来你想要这样的东西:

$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
  if(++$i === $numItems) {
    echo "last index!";
  }
}    

话虽这么说,你没有 - foreach在PHP中使用php 迭代"数组" .


`$ numItems = count($ arr)`技巧不需要并且降低了可读性 - 在PHP中,每次访问count($ arr)都没有性能损失.原因是项目计数在内部保存为数组头中的特殊字段,并且**不是**即时计算的.这个技巧来自其他语言(C,Java?,...).
有趣的是@johndodo,每次访问计数($ arr)都没有性能损失.您是否有任何指向此特定优化的链接/来源?谢谢!
我发现这是最好的解决方案 - http://stackoverflow.com/a/8780881/363867
令人遗憾的是,在PHP中,对这个问题最正确的解决方案看起来相当不优雅:(

2> Jeremy Ruten..:

您可以使用数组的最后一个键的值end(array_keys($array))并将其与当前键进行比较:

$last_key = end(array_keys($array));
foreach ($array as $key => $value) {
    if ($key == $last_key) {
        // last element
    } else {
        // not last element
    }
}


在我自己的辩护中,我的答案不依赖于具有数字键的数组:)
修复STRICT NOTICE:`$ lastKey = array_search(end($ array),$ array);`
它很优雅,但会导致STRICT NOTICE,因为"end"需要一个参考值:(
+1我同意-其他解决方案依赖于具有数字索引的数组。
字符串比较比整数慢,并且在将字符串与整数比较时并不总是准确的(你至少应该使用===).我投了这票.

3> 小智..:

为什么这么复杂?

foreach($input as $key => $value) {
    $ret .= "$value";
    if (next($input)==true) $ret .= ",";
}

这将在除最后一个之外的每个值后面添加一个!


除非我弄错了,否则这不起作用,因为调用next()会使数组指针前进,所以你正在跳过循环中的每个其他元素.
如果下一个$ input包含布尔值false,则不会,这是next()的主要问题.
似乎对我不起作用.第二个最后一个元素没有得到逗号,但它应该.

4> OIS..:

当toEnd达到0时,表示它处于循环的最后一次迭代.

$toEnd = count($arr);
foreach($arr as $key=>$value) {
  if (0 === --$toEnd) {
    echo "last index! $value";
  }
}

在循环之后,最后一个值仍然可用,因此如果您只想在循环之后将其用于更多内容,则更好:

foreach($arr as $key=>$value) {
  //something
}
echo "last index! $key => $value";

如果您不想将最后一个值视为特殊的内部循环.如果您有大型数组,这应该更快.(如果在同一范围内的循环之后重用数组,则必须先"复制"数组).

//If you use this in a large global code without namespaces or functions then you can copy the array like this:
//$array = $originalArrayName; //uncomment to copy an array you may use after this loop

//end($array); $lastKey = key($array); //uncomment if you use the keys
$lastValue = array_pop($array);

//do something special with the last value here before you process all the others?
echo "Last is $lastValue", "\n";

foreach ($array as $key => $value) {
    //do something with all values before the last value
    echo "All except last value: $value", "\n";
}

//do something special with the last value here after you process all the others?
echo "Last is $lastValue", "\n";

并回答你的原始问题"在我的情况下,在构建查询时附加或/和参数"; 这将遍历所有值,然后将它们连接在一起,在它们之间加上"和",但不是在第一个值之前或最后一个值之后:

$params = [];
foreach ($array as $value) {
    $params[] = doSomething($value);
}
$parameters = implode(" and ", $params);


当然,它会为每次迭代执行 - $ toEnd,这就是重点.如果我将它移到循环之外,它将不再起作用.

5> hakre..:

已经有很多答案,但是也值得研究迭代器,特别是因为它被要求采用标准方法:

$arr = range(1, 3);

$it = new CachingIterator(new ArrayIterator($arr));
foreach($it as $key => $value)
{
  if (!$it->hasNext()) echo 'Last:';
  echo $value, "\n";
}

您可能会发现某些内容对其他案例也更加灵活.



6> Raheel..:

一种方法是检测迭代器是否有next.如果没有下一个附加到迭代器,则意味着您处于最后一个循环中.

foreach ($some_array as $element) {
    if(!next($some_array)) {
         // This is the last $element
    }
}



7> Rok Kralj..:

因此,如果您的数组具有唯一的数组值,那么确定上一次迭代是微不足道的:

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

如你所见,如果最后一个元素在数组中只出现一次,则可以正常工作,否则会出现误报.在它不是,你必须比较键(肯定是唯一的).

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

还要注意严格的coparision运算符,这在这种情况下非常重要.



8> 小智..:

假设您将数组存储在变量中...

foreach($array as $key=>$value) 
{ 
    echo $value;
    if($key != count($array)-1) { echo ", "; }
}


这不适用于关联数组.$ key并不总是一个数字.
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有