在第二个元素的关联数组上启动 foreach 循环


Start foreach loop on associative array at the second element

>我有关联数组,例如:

$myArray = array(
  'key1' => 'val 1',
  'key2' => 'val 2'
  ...
);

我不知道前面的关键值,但想从第二个元素开始循环。 在上面的示例中,这将是从 key2 开始的。

我试过了

foreach(next(myArray) as $el) {
}

但这没有用。

替代方案可能array_slice,但这似乎很混乱。 我错过了一些明显的东西吗?

确实没有"一种真正的方法"可以做到这一点。因此,我将它作为您应该去哪里的基准。

所有信息都基于此数组。

$array = array(
    1 => 'First',
    2 => 'Second',
    3 => 'Third',
    4 => 'Fourth',
    5 => 'Fifth'
);

array_slice() 选项。你说你认为这个选项是矫枉过正的,但在我看来它是代码最短的。

foreach (array_slice($array, 1) as $key => $val)
{
    echo $key . ' ' . $val . PHP_EOL;
}

执行此操作 1000 次需要 0.015888 秒。


有处理指针的数组函数,例如...

  • current() - 返回数组中的当前元素。
  • end() - 将数组的内部指针设置为其最后一个元素。
  • prev() - 倒带内部数组指针。
  • reset() - 将数组的内部指针设置为其第一个元素。
  • each() - 从数组返回当前键和值对,并前进数组游标。

请注意,each() 函数已从 PHP 7.2 开始弃用,并将在 PHP 8 中删除。

这些函数为您提供了最快的解决方案,超过 1000 次迭代。

reset($array);
while (next($array) !== FALSE)
{
    echo key($array) . ' ' . current($array) . PHP_EOL;
}

这样做 1000 次,需要 0.014807 秒。


设置变量选项。

$first = FALSE;
foreach ($array as $key => $val)
{
    if ($first != TRUE)
    {
        $first = TRUE;
        continue;
    }
    echo $key . ' ' . $val . PHP_EOL;
}

执行此操作 1000 次需要 0.01635 秒。


我拒绝了array_shift选项,因为它会编辑您的数组,而您从未说过这是可以接受的。

这取决于您是只想执行此操作一次还是多次,以及以后是否仍需要原始数组。

"第一"模式

$first = true;
foreach ($array as $key=>value) {
    if($first) {
        $first = false;
        continue;
    }
    // ... more code ...
}

我个人经常使用这个解决方案,因为它非常简单,每个人都明白这一点。此外,创建新阵列不会对性能造成影响,您仍然可以在循环后对原始阵列进行操作。

但是,如果你有几个这样的循环,它开始看起来有点不干净,因为每个循环需要 5 行额外的代码。

array_shift

array_shift($array);
foreach ($array as $key=>value) {
    // .... more code ....
}

array_shift是为这种不需要第一个元素的特殊情况量身定制的函数。从本质上讲,这是一种 Perl 式的$array = array_slice($array, 1)表达方式,可能并不完全明显,特别是因为它修改了原始数组。

因此,您可能需要复制原始数组并移动它,如果您以后既需要多次移动数组,也需要原始数组。

array_slice

当然,还有array_slice本身。如果您希望原始数组保持不变并且多次需要切片数组,我认为array_slice没有任何问题。但是,如果您确定自己总是只想切掉一个元素,则不妨使用速记array_shift(如果需要,请先复制)。

你可以用显而易见的方式:

$flag = false;
foreach($myArray as $el) {
   if($flag) {
      // do what you want
   }
   $flag = true;
}

只是另一种灵活迭代的方式:

reset($myArray);  // set array pointer to the first element  
next($myArray);   // skip first element
while (key($myArray) !== null) {
  // do something with current($myArray)
  next($myArray);
}

据我所知foreach只是这种结构的一种捷径。

来自 Zend PHP 5 认证学习指南:

如您所见,使用这组函数 [重置, 下一个, 键, 当前, ...]需要相当多的工作;公平地说,有一些 它们提供唯一合理的迭代方式的情况 通过数组,特别是当您需要来回跳过时 在其元素之间。但是,如果您需要做的就是迭代 从头到尾贯穿整个数组,PHP 提供了一个方便的 foreach() 构造形式的快捷方式。

如果您的数组是基于 0 的,它将是 if($key>=1) ,但是当您的数组从键 1 开始时,这应该可以工作。

foreach ($array as $key=>$value){if($key>=2){
        do stuff    
        }}

你可以试试:

$temp = array_shift($arr);
foreach($arr as $val) {
   // do something
}
array_unshift($arr, $temp);
reset($myArray);  
next($myArray); 
while ($element = each($myArray))
{
    //$element['key'] and $element['value'] can be used
}

当这个问题弹出时,我相当简单的解决方案。它有一个很好的优势,即很容易被修改,如果你愿意,可以跳过不仅仅是第一个元素。

$doomcounter = 0;    
foreach ($doomsdayDevice as $timer){ if($doomcounter == 0){$doomcounter++; continue;} 
   // fun code goes here
}