如何在PHP中的特定索引处启动foreach循环

Nia*_*vez 59 php

我写的是一个foreach不是从第0个索引开始,而是从我的数组的第一个索引开始.有没有办法抵消循环的起点?

TRi*_*RiG 92

把事情简单化.

foreach ($arr as $k => $v) {
   if ($k < 1) continue;
   // your code here.
}
Run Code Online (Sandbox Code Playgroud)

请参阅continue手册中的控制结构.

  • 这是可行的,但要注意时间成本,因为您在到达所需索引之前要循环整个数组。如果可能,请改用 for() 循环。 (2认同)

Gor*_*don 30

A Foreach将重置数组:

注意:当foreach首次开始执行时,内部数组指针会自动重置为数组的第一个元素.这意味着您不需要在foreach循环之前调用reset().

使用for循环(仅当它不是关联数组时)

$letters = range('a','z');
for($offset=1; $offset < count($letters); $offset++) {
    echo $letters[$offset];
}
Run Code Online (Sandbox Code Playgroud)

while循环(可以是任何数组)

$letters = range('a','z');
next($letters);
while($letter = each($letters)) {
    echo $letter['value'];
}
Run Code Online (Sandbox Code Playgroud)

或者用 LimitIterator

$letters = new LimitIterator(new ArrayIterator(range('a','z')), 1);
foreach($letters as $letter) {
    echo $letter;
}
Run Code Online (Sandbox Code Playgroud)

它允许您通过构造函数指定起始偏移量和计数.

以上所有都将输出字母b到z而不是a到z


Cri*_*ian 19

你可以使用这个array_slice功能:

$arr = array(); // your array
foreach(array_slice($arr, 1) as $foo){
   // do what ever you want here
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用您想要的任何偏移值.在这种情况下,1'跳过'数组的第一个元素.

  • 毫无用处,这将需要复制该阵列的该块。如果数组很大,可能是一件坏事。 (2认同)

2nd*_*boy 3

在 foreach 中你不能这样做。想要得到你想要的,只有两种方法:

  1. 使用 for 循环并从位置 1 开始
  2. 使用 foreach 并在实际代码周围使用类似 if($key>0) 的东西

foreach 执行其名称所告诉您的操作。为每个元素做一些事情:)

编辑:好的,我想到了一个非常邪恶的解决方案。请尝试以下操作:

foreach(array_reverse(array_pop(array_reverse($array))) as $key => $value){
    ...
}
Run Code Online (Sandbox Code Playgroud)

这将反转数组,弹出最后一个元素并再次反转它。比你将拥有一个不包括第一个元素的元素。

但我建议使用其他解决方案之一。最好的是第一个。

还有一种变体:您可以使用 array_slice() 来实现:

foreach(array_slice($array, 1, null, true) as $key => $value){
    ...
} 
Run Code Online (Sandbox Code Playgroud)

但是您应该使用所有三个参数来保留 foreach 循环的数组键: