2011-05-23 108 views
50

请帮我翻译这个伪代码,以真正的PHP代码:检查,如果当前元素为最后一个元素

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

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

+5

为什么不对'count($ arr) - 1'迭代使用'for'循环? – Marcin 2011-05-23 01:44:36

+0

如果你有混合键,你如何确定哪个键是最后一项?如果您希望它作为添加到数组中的最后一项,则应该有一些数据来指示时间戳。 – Rasika 2011-05-23 01:53:14

+0

last的定义:由数组的内部顺序决定。这与说foreach循环选择的最后一个元素相同 – shealtiel 2011-05-23 02:32:32

回答

88

您可以使用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'; 
    } 
} 

UPDATE1

正如@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. 
    } 
} 

UPDATE2

我找到解决方案通过@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_

+9

如果您在数组中有多次相同的值 – Mijoja 2012-04-10 19:51:11

+2

谢谢@Mijoja指出,这将会出现问题。更新了代码:) – 2012-04-11 07:16:01

11
$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_poparray_keys创建的临时阵列上的作品不修改原始数组的。

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

我比接受的答案更喜欢这个,因为它只需要一行用于循环外的初始化。 – 2012-12-11 17:27:46

+0

我喜欢这个比接受的答案更好,因为它不会改变你要循环的数组的内部指针。 – autonymous 2013-07-01 18:03:03

+0

对第一个元素'$ first = array_shift(array_keys($ myarray2));' – Luke 2014-05-27 06:23:37

0

如果项目按数字排序,则使用key()函数确定当前项目的索引并将其与长度进行比较。你必须通过的项目在一个while循环使用的next()或prev()循环,而不是一个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 
} 
+0

因为这是我在Google搜索时发现的第一件事。了解所有不同的方法来做同样的事情,并且更好地精通是很好的。 :D – trusktr 2011-05-23 02:13:35

+1

不适用于非数字或非严格订购的项目 – shealtiel 2011-05-23 02:35:37

+0

呃,是的。感谢您指出了这一点! – trusktr 2011-05-26 04:16:44

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 
14

这永远不会把戏对我来说

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塞尔让

提到E_STRICT警告0
$array_keys = array_keys($array); 
$last_key = end($array_keys); 
+0

更优雅,更轻松! :) – 2014-11-25 18:02:49

+0

我不知道为什么这个评论不是被接受的答案。对于绝大多数潜在用例(即关联的**和**枚举数组),所有提供的答案和工作都是最简单/最干净的。 – Pierce 2015-01-30 01:16:52

+1

@Pierce给你一个提示:这是在接受答案后的3年半回答,再加上如果你的数组中有1000个项目,你将调用“结束”1000次和“array_keys”1000次。 – StefanNch 2015-04-10 15:38:19

1

我的解决办法,也很简单..

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

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

我这里知道这是旧的,并且使用SPL迭代器也许只是一个矫枉过正,但无论如何,另一种解决方案:

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

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

$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 
    } 
} 
相关问题