【问题标题】:How to start a foreach loop at a specific index in PHP如何在 PHP 中的特定索引处启动 foreach 循环
【发布时间】:2011-03-14 21:08:43
【问题描述】:

我正在编写一个foreach,它不是从第 0 个索引开始,而是从数组的第一个索引开始。有什么办法可以抵消循环的起点吗?

【问题讨论】:

  • 用FOR代替会不会更好?
  • 在 foreach 循环中处理键值对要容易得多,我想这就是他想要进行 foreach 的原因。或者他甚至有一个 foreach 并且不想更改很多代码。

标签: php


【解决方案1】:

保持简单。

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

参见手册中的continue控制结构。

【讨论】:

  • 我喜欢这个解决方案。每个版本的 PHP 都可以继续使用吗?
  • ie2.php.net/manual/en/control-structures.continue.php 没有提及它何时可用,所以我认为它从一开始就存在。
  • 如果数组没有被索引?
  • if ($k == $firstIndex) continue; where $firstIndex = 0; 在数字索引的情况下或$firstIndex = 'myFirstKeyIndex'; 在关联数组的情况下怎么样?
  • 这可行,但要注意时间成本,因为在获取所需索引之前,您要遍历整个数组。如果可能,请改用 for() 循环。
【解决方案2】:

Foreach 将重置数组:

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

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

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

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

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

LimitIterator

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

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

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

【讨论】:

  • LimitIterator 就是这样。 ;)
【解决方案3】:

你可以使用array_slice函数:

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

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

【讨论】:

  • 毫无价值,这将需要复制该数组块。如果数组很大,可能是一件坏事。
  • 你是对的......这对于短数组会更好。感谢您的评论。
【解决方案4】:

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

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

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

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

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

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

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

还有一个变体:您可以为此使用 array_slice():

foreach(array_slice($array, 1, null, true) as $key => $value){
    ...
} 

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

【讨论】:

  • 使用 array_slice 可以在 foreach 循环中执行此操作,但应高度劝阻这种做法,并且必须阅读此类代码。
  • 这就是为什么我指出这样做是一种邪恶的方法。但我个人不会使用任何解决方案。我会使用 if 语句或 for 循环。
【解决方案5】:

似乎 for 循环会是更好的方法,但如果您认为必须使用 foreach,您可以将第一个元素移出数组并将其重新移回:

$a = array('foo','bar');
$temp = array_shift($a);
foreach ( $a as $k => $v ) {
  //do something
}
array_unshift($a, $temp);

【讨论】:

  • 请注意$k =&gt; $v 语法仅适用于关联数组。对于索引数组,您只需要$a as $v
  • @Michael:$k => $v 也适用于索引数组并返回当前值的索引号。
【解决方案6】:

好吧,没有人说,但如果你不介意改变数组,如果我们想从给定数组的第二个元素开始:

unset($array[key($array)]);
foreach($array as $key=>$value)
{
    //do whatever
}

如果您介意,请添加,

$saved = $array;
unset($array[key($array)]);
foreach($array as $key=>$value)
{
    //do whatever
}
$array = $saved;

此外,如果您想跳过给定的已知索引,只需替换

key($array)

根据给定的索引

【讨论】:

    【解决方案7】:

    比斯米拉... 很简单,只需制作自己的钥匙

     $keys=1;
        foreach ($namafile_doc as $value ) {
            $data['doc'.$keys]=$value;
            $keys++;
        }
    

    这个答案可能有用吗

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      相关资源
      最近更新 更多