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

Vai*_*ble 199 php foreach

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

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

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

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

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

Ric*_*eur 289

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

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

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

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

Jer*_*ten 197

您可以使用数组的最后一个键的值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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在我自己的辩护中,我的答案不依赖于具有数字键的数组:) (18认同)
  • 修复STRICT NOTICE:`$ lastKey = array_search(end($ array),$ array);` (10认同)
  • 它很优雅,但会导致STRICT NOTICE,因为"end"需要一个参考值:( (4认同)
  • +1我同意-其他解决方案依赖于具有数字索引的数组。 (2认同)
  • 字符串比较比整数慢,并且在将字符串与整数比较时并不总是准确的(你至少应该使用===).我投了这票. (2认同)
  • 这应该是在不触发错误消息的情况下获取数组最后一个键的最快方法:end($array); $last_key = key($array); (2认同)
  • 这不起作用,因为您不能将 array_keys 的结果与 end() 一起使用。请参阅:/sf/ask/324531651/。首先,您必须分配 array_keys 的结果: $keys = array_keys($array); 然后你可以得到最后一个条目: $lastKey = end($keys); (2认同)

小智 40

为什么这么复杂?

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

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

  • 除非我弄错了,否则这不起作用,因为调用next()会使数组指针前进,所以你正在跳过循环中的每个其他元素. (27认同)
  • 如果下一个$ input包含布尔值false,则不会,这是next()的主要问题. (2认同)
  • 似乎对我不起作用.第二个最后一个元素没有得到逗号,但它应该. (2认同)
  • 对于任何想要在 PHP7 中使用它的人来说,请注意 - 数组指针不会在 foreach 循环中移动,这将不起作用。 (2认同)

OIS*_*OIS 23

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

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

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

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

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

//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";
Run Code Online (Sandbox Code Playgroud)

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

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

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

hak*_*kre 20

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

$arr = range(1, 3);

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

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


Rah*_*eel 13

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

foreach ($some_array as $element) {
    if(!next($some_array)) {
         // This is the last $element
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不适用于 PHP 7+,因为“在 PHP 7 中,foreach 不使用内部数组指针。”。 (3认同)

Dar*_*der 10

从 foreach 数组中获取第一个和最后一个元素

foreach($array as $value) {
    if ($value === reset($array)) {
        echo 'FIRST ELEMENT!';
    }

    if ($value === end($array)) {
        echo 'LAST ITEM!';
    }
}
Run Code Online (Sandbox Code Playgroud)


Rok*_*alj 8

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

foreach($array as $element) {
    if ($element === end($array))
        echo 'LAST ELEMENT!';
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


San*_*zar 8

不要在最后一个值后添加逗号:

数组:

$data = ['lorem', 'ipsum', 'dolor', 'sit', 'amet'];
Run Code Online (Sandbox Code Playgroud)

功能:

$result = "";
foreach($data as $value) {
    $resut .= (next($data)) ? "$value, " : $value;
}
Run Code Online (Sandbox Code Playgroud)

结果:

print $result;
Run Code Online (Sandbox Code Playgroud)

lorem、ipsum、dolor、sit、amet


ash*_*deh 6

从 PHP 7.3 到现在您可以使用数组的最后一个键的值array_key_last($array)并将其与当前键进行比较:

$last_key = array_key_last($array);
foreach ($array as $key => $value) {
    if ($key == $last_key) {
        // last element
    } else {
        // not last element
    }
}
Run Code Online (Sandbox Code Playgroud)


nic*_*ckf 5

您仍然可以将该方法与关联数组一起使用:

$keys = array_keys($array);
for ($i = 0, $l = count($array); $i < $l; ++$i) {
    $key = $array[$i];
    $value = $array[$key];
    $isLastItem = ($i == ($l - 1));
    // do stuff
}

// or this way...

$i = 0;
$l = count($array);
foreach ($array as $key => $value) {
    $isLastItem = ($i == ($l - 1));
    // do stuff
    ++$i;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

  • 这不适用于关联数组.$ key并不总是一个数字. (3认同)