在 foreach 中,是否存在 isLastItem() 方法?

10

使用普通的for循环,可以通过比较当前索引和最后一个来判断是否处于循环的最后一次迭代。在使用foreach时是否有类似的方法呢?我的意思是像这样。

foreach($array as $item){
  //do stuff
  //then check if we're in the last iteration of the loop
  $last_iteration = islast(); //boolean true/false
}

如果不行的话,是否可以知道当前迭代的索引位置,例如 $iteration = 5,这样我就可以手动将其与 $array 的长度进行比较了吗?


很遗憾,在本地 PHP 中没有这样的功能。我在想是否可以通过查询数组中的当前指针位置来实现?虽然我从未见过类似的实现,所以可能不行。 - Pekka
也许你应该详细说明为什么想知道当前值是否为最后一个值。 - Gumbo
那么,是否有一种方法可以知道当前迭代的当前索引,例如 $iteration = 5,这样我就可以手动将其与 $array 的长度进行比较? - zmol
@Gumbo 我需要采取特定的操作(或不采取特定的操作),比如不添加底部边框标记到表格的标记中。这种情况... - zmol
1
@zmol:你可以用CSS来处理这个问题。 - Gumbo
8个回答

22

计数方法可能是最简单的。

$i = count($array);
foreach($array as $item){
  //do stuff
  //then check if we're in the last iteration of the loop
  $last_iteration = !(--$i); //boolean true/false
}

+1 我赞同 Gumbo 的观点,但你的解决方案似乎也能达到同样的效果,而且更简单。 - AntonioCS

13

2
以下是一些方法:
- 方法1; - 方法2; - 方法3。
$items  = ["Bhir", "Ekky", null, "Uych", "foo"=>"bar"];
$values = array_values($items);

// Bhir, Ekky, Uych, bar
foreach ($values as $i => $item) {
    print("$item");
    $next = isset($values[$i + 1]);
    if ($next) {
        print(", ");
    }
}

// Bhir, Ekky, , Uych, bar
foreach ($values as $i => $item) {
    print("$item");
    $next = array_key_exists($i + 1, $values);
    if ($next) {
        print(", ");
    }
}

// Bhir, Ekky, , Uych, bar
$i = count($values);
foreach ($items as $item) {
    print("$item");
    $next = !!(--$i);
    if ($next) {
        print(", ");
    }
}

// Bhir, Ekky, , Uych, bar
$items = new \CachingIterator(new \ArrayIterator($items));
foreach ($items as $item) {
    print("$item");
    $next = $items->hasNext();
    if ($next) {
        print(", ");
    }
}

1
end($array);
$lastKey = key($array);
foreach($array as $key => $value) {
   if ($key === $lastKey) {
      // do something endish
   }
}

1

valid() 方法用于判断 ArrayIterator 对象是否还有更多元素。

参见:

$arr = array("Banana","Abacaxi","Abacate","Morango");

$iter = new ArrayIterator($arr);

while($iter->valid()){

    echo $iter->key()." - ".$iter->current()."<br/>";

    $iter->next();

}

1
不,你需要一个计数器并知道列表中的项目数量。你可以使用 end() 来获取数组中的最后一项,并查看它是否与你的foreach中的当前值匹配。

好的解决方法,但正如@Dan Grossman所指出的那样,这取决于值是唯一的,以便不会混淆。 - zmol

1
如果您知道数组的值始终是唯一的,您可以将当前的$itemend($array)进行比较,以确定是否已经到达了最后一个项目。否则,您需要一个计数器。

1
你可以像这样在 foreach() 中获取键和值:

foreach($array as $key=>$value) { ... }

或者,你可以对数组进行 count(),以便知道有多少项,并使用递增计数器来确定何时到达最后一项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接