在数组迭代期间检查当前元素是否为最后一个元素


78

请帮助我将此伪代码转换为真实的php代码:

 foreach ($arr as $k => $v)
    if ( THIS IS NOT THE LAST ELEMENT IN THE ARRAY)
        doSomething();

编辑:数组可能具有数字键或字符串键


6
为什么不使用for循环进行count($arr) - 1迭代?
Marcin

1
如果您有混合键,如何确定最后一个键是哪个键?如果要将其作为添加到数组的最后一项,则应该有一些数据指示时间戳。
拉西卡

last的定义:按数组的内部顺序。这与
说说

Answers:


136

您可以使用PHP的end()

$array = array('a' => 1,'b' => 2,'c' => 3);
$lastElement = end($array);
foreach($array as $k => $v) {
    echo $v . '<br/>';
    if($v == $lastElement) {
         // 'you can do something here as this condition states it just entered last element of an array'; 
    }
}

更新1

如@Mijoja所指出的,如果数组中多次具有相同的值,则上述内容可能会出现问题。下面是解决方法。

$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
//point to end of the array
end($array);
//fetch key of the last element of the array.
$lastElementKey = key($array);
//iterate the array
foreach($array as $k => $v) {
    if($k == $lastElementKey) {
        //during array iteration this condition states the last element.
    }
}

更新2

我发现@onteria_的解决方案比我已经回答的要好,因为它不修改数组内部指针,我正在更新答案以匹配他的答案。

$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
// Get array keys
$arrayKeys = array_keys($array);
// Fetch last array key
$lastArrayKey = array_pop($arrayKeys);
//iterate array
foreach($array as $k => $v) {
    if($k == $lastArrayKey) {
        //during array iteration this condition states the last element.
    }
}

谢谢@onteria_

更新3

正如@CGundlach所指出的,PHP 7.3的引入array_key_last似乎是更好的选择,如果您使用的是PHP> = 7.3

$array = array('a' => 1,'b' => 2,'c' => 3);
$lastKey = array_key_last($array);
foreach($array as $k => $v) {
    echo $v . '<br/>';
    if($k == $lastKey) {
         // 'you can do something here as this condition states it just entered last element of an array'; 
    }
}

11
这会出现问题,如果你有相同的值多次在阵列中
Mijoja

1
@IbrahimAzharArmar刚刚找到了这个答案,并且在实现您的解决方案时,我注意到,自PHP 7.3起,就有了函数array_key_last,该函数还返回数组的最后一个键,而不影响内部指针:secure.php.net/array_key_last。将进一步简化您的解决方案:)
CGundlach

1
@CGundlach很高兴知道。将更新答案。谢谢。
Ibrahim Azhar Armar

26

这总是对我有用

foreach($array as $key => $value) {
   if (end(array_keys($array)) == $key)
       // Last key reached
}

编辑30/04/15

$last_key = end(array_keys($array));
reset($array);

foreach($array as $key => $value) {
  if ( $key == $last_key)
      // Last key reached
}

为了避免@Warren Sergent提到的E_STRICT警告

$array_keys = array_keys($array);
$last_key = end($array_keys);

更优雅,更轻松!:)
拉斐尔·莫尼

我不确定为什么此评论不是可接受的答案。在提供的所有答案中,它是最简单/最简单的方法,并且适用于绝大多数潜在用例(即关联数组枚举数组)。
皮尔斯2015年

1
@Pierce给您一个提示:这个答案在接受答案的三年半之后得到了回答,另外,如果您的数组中有1000个项目,则将“结束”调用1000次,将“ array_keys”调用1000次。
StefanNch 2015年

如果要遍历大型阵列,这显然会带来性能问题。在这种情况下,我的建议是将end(array_keys($ array))移出循环。但是请确保在迭代之前重置阵列。
理查德·

如果要学究脚步,请在严格模式下使用end(array_keys($ array))发出通知,因为“只能通过引用传递变量”-若要更正此问题,请定义$ array_keys = array_keys($ array)并调用$ array_keys变量上的end()。
沃伦·瑟金特

14
$myarray = array(
  'test1' => 'foo',
  'test2' => 'bar',
  'test3' => 'baz',
  'test4' => 'waldo'
);

$myarray2 = array(
'foo',
'bar',
'baz',
'waldo'
);

// Get the last array_key
$last = array_pop(array_keys($myarray));
foreach($myarray as $key => $value) {
  if($key != $last) {
    echo "$key -> $value\n";
  }
}

// Get the last array_key
$last = array_pop(array_keys($myarray2));
foreach($myarray2 as $key => $value) {
  if($key != $last) {
    echo "$key -> $value\n";
  }
}

由于对它array_pop创建的临时数组起作用,array_keys所以根本不会修改原始数组。

$ php test.php
test1 -> foo
test2 -> bar
test3 -> baz
0 -> foo
1 -> bar
2 -> baz

我喜欢这个比接受的答案更好,因为它只需要一行就可以在循环外进行初始化。
约旦列夫

我喜欢这个比接受的答案更好,因为它不会改变您要遍历的数组的内部指针。
2013年

对第一个元素执行相同操作$first = array_shift(array_keys($myarray2));
路加福音2014年

2
这会在E_STRICT中产生一个通知:运行时通知:只能通过引用传递变量
Vigintas Labakojis

这似乎比我的答案更好,更新了我的答案。
Ibrahim Azhar Armar,2015年

5

为什么不使用这种非常简单的方法:

$i = 0; //a counter to track which element we are at
foreach($array as $index => $value) {
    $i++;
    if( $i == sizeof($array) ){
        //we are at the last element of the array
    }
}

2

我知道这很老了,使用SPL迭代器可能只是一个矫kill过正,但是无论如何,这里还有另一个解决方案:

$ary = array(1, 2, 3, 4, 'last');
$ary = new ArrayIterator($ary);
$ary = new CachingIterator($ary);
foreach ($ary as $each) {
    if (!$ary->hasNext()) { // we chain ArrayIterator and CachingIterator
                            // just to use this `hasNext()` method to see
                            // if this is the last element
       echo $each;
    }
}

1

我的解决方案也很简单

$array = [...];
$last = count($array) - 1;

foreach($array as $index => $value) 
{
     if($index == $last)
        // this is last array
     else
        // this is not last array
}

只要您的阵列键是自动生成的,这就是非常好的简单。
马特·基兰

0

如果项目按数字顺序排序,请使用key()函数确定当前项目的索引并将其与长度进行比较。您必须使用next()或prev()在while循环(而不是for循环)中循环浏览项目:

$length = sizeOf($arr);
while (key(current($arr)) != $length-1) {
    $v = current($arr); doSomething($v); //do something if not the last item
    next($myArray); //set pointer to next item
}

因为这是我搜索Google时发现的第一件事。知道做同一件事的所有不同方法并精通它是很好的。:D
trusktr 2011年

1
不适用于非数字或其他非严格订购的商品
shealtiel 2011年

0
$arr = array(1, 'a', 3, 4 => 1, 'b' => 1);
foreach ($arr as $key => $val) {
    echo "{$key} = {$val}" . (end(array_keys($arr))===$key ? '' : ', ');
}
// output: 0 = 1, 1 = a, 2 = 3, 4 = 1, b = 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.