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

时间:2013-09-08 20:12:28

标签: php

我有关联数组,例如:

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

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

我试过

foreach(next(myArray) as $el) {

}

但是没有用。

替代品可能是array_slice,但这看起来很混乱。我错过了一些明显的东西吗?

8 个答案:

答案 0 :(得分:20)

实际上没有“一种真正的方式”。所以我会把它作为你应该去哪里的基准。

所有信息都基于此数组。

$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() - 从数组中返回当前键和值对,并使数组光标前进。

请注意,自PHP 7.2起,each()函数已被弃用,将在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选项,因为它编辑了您的数组并且您从未说过这是可以接受的。

答案 1 :(得分:4)

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

“第一”模式

$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是针对不需要第一个元素的特殊情况量身定制的函数。从本质上讲,这是一种说$array = array_slice($array, 1)的Perl-ish方式,可能并不完全明显,特别是因为它修改了原始数组。

所以,你可能想制作原始数组的副本并移动它,如果你需要多次移位数组,以及稍后需要原始数组。

array_slice

当然,还有array_slice本身。如果您希望原始数组保持不变并且您需要多次切片数组,我认为array_slice没有任何问题。但是,如果你总是希望只关闭一个元素,那么你也可以使用速记array_shift(并在需要之前制作副本)。

答案 2 :(得分:2)

你可以用明显的方式:

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

答案 3 :(得分:2)

灵活迭代的另一种方式:

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认证学习指南:

  

如您所见,使用这组函数[reset,next,key,   当前,...]需要相当多的工作;公平地说,有一些   他们提供唯一合理的迭代方式的情况   通过数组,特别是如果你需要来回跳过   它的元素之间。但是,如果您需要做的只是迭代   通过从开始到完成的整个数组,PHP提供了一个方便   foreach()构造形式的快捷方式。

答案 4 :(得分:2)

如果您的阵列 0 ,它将是if($key>=1),但是当您的阵列从 key 1 开始时,这应该可行。

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

答案 5 :(得分:1)

你可以尝试:

$temp = array_shift($arr);
foreach($arr as $val) {
   // do something
}
array_unshift($arr, $temp);

答案 6 :(得分:1)

reset($myArray);  
next($myArray); 

while ($element = each($myArray))
{
    //$element['key'] and $element['value'] can be used
}

答案 7 :(得分:0)

当这个问题弹出时,我的相当简单的解决方案。它有一个很好的优点,就是你可以轻松修改它,以便能够跳过不仅仅是第一个元素。

$doomcounter = 0;    
foreach ($doomsdayDevice as $timer){ if($doomcounter == 0){$doomcounter++; continue;} 

   // fun code goes here

}