问题很简单。我有一个foreach循环在我的代码:
foreach($array as $element) {
//code
}
在这个循环中,当我们在第一次或最后一次迭代时,我希望做出不同的反应。
如何做到这一点?
问题很简单。我有一个foreach循环在我的代码:
foreach($array as $element) {
//code
}
在这个循环中,当我们在第一次或最后一次迭代时,我希望做出不同的反应。
如何做到这一点?
当前回答
这很简单!
// 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];
}
谢谢你@billynoah整理了最后的问题。
其他回答
1:为什么不用简单的for语句呢?假设你使用的是一个真实的数组而不是Iterator,你可以很容易地检查counter变量是0还是比元素的总数少1。在我看来,这是最干净、最容易理解的解决方案……
$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
}
}
2:你应该考虑使用嵌套集来存储你的树结构。此外,您可以通过使用递归函数来改进整个过程。
你也可以使用匿名函数:
$indexOfLastElement = count($array) - 1;
array_walk($array, function($element, $index) use ($indexOfLastElement) {
// do something
if (0 === $index) {
// first element‘s treatment
}
if ($indexOfLastElement === $index) {
// last not least
}
});
还有三件事需要提一下:
如果你的数组没有严格的索引(数值上),你必须首先通过array_values管道你的数组。 如果你需要修改$元素,你必须通过引用(&$element)传递它。 在匿名函数内部需要的任何外部变量,都必须在use构造中将它们列在$indexOfLastElement旁边,如果需要,同样通过引用。
这很简单!
// 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];
}
谢谢你@billynoah整理了最后的问题。
上面的一个更简化的版本,并假设您不使用自定义索引……
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
} else if ($index == $len - 1) {
// last
}
}
版本2 -因为我已经讨厌使用else除非必要。
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
// do something
continue;
}
if ($index == $len - 1) {
// last
// do something
continue;
}
}
使用布尔变量仍然是最可靠的,即使你想检查$值的第一次出现(我发现它在我的情况和许多情况下更有用),比如:
$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';
}
}
然后使用!next($array)查找最后一个$值,如果没有next()值要迭代,该$值将返回true。
如果我要使用计数器,我更喜欢使用for循环而不是foreach,就像这样:
$len = count( $array );
for ( $i = 0; $i < $len; $i++ ) {
$value = $array[$i];
if ($i === 0) {
// first
} elseif ( $i === $len - 1 ) {
// last
}
// …
$i++;
}