PHP:如何在foreach循环中移动数组指针?

时间:2012-05-05 04:27:47

标签: php

$animals = array('cat', 'dog', 'horse', 'elephant');
foreach($animals as $animal)
{
   var_dump($animal);
   next($animals);
}

上面的代码输出:猫,狗,马,大象。我认为next函数应该移动$animals的内部指针,因此,我应该得到这个输出:cat,horse。

如何使$ animals的内部指针前进(和后退)以使它在foreach中受到影响?

编辑1:

从手册:

  

因为foreach依赖于内部数组指针在内部更改它   循环可能会导致意外行为。

尽管如此,我认为这是我需要做的事情。

编辑2:

根据“你的常识”的链接,我将提供有关我的问题的更详细的解释。这是一些伪代码:

array $foos;

start loop of $foos
 - do thing #1
 - do thing #2
 - do thing #3
 - keep doing thing #3 while the current value of $foos in the loop meets a certain criteria
loop

当执行返回到循环的开始时,它应该从#3访问的最后一个数组继续。 请注意,数组是关联的,因此for ($i = 0 ...方法不起作用。

6 个答案:

答案 0 :(得分:9)

您只需创建一个ArrayIterator­Docs seekable­Docs

因为它是一个迭代器,你可以改变位置 你迭代它,一些基本的例子:

foreach ($iterator as $current) {
    $iterator->next();
}

它应该提供你需要的所有东西。如果没有,您也可以自己封装您自己的需求{/ 3}}。

答案 1 :(得分:6)

您不应将foreach与直接指针访问混合使用。如果您想在数组中移动,只需将foreach替换为C风格的for。它在顶部比较单词,但与foreach情况的循环体相同,不同之处在于您可以使用内部指针进行混乱并获得所需的结果。

$animals = array('cat', 'dog', 'horse', 'elephant');
for ($animal = current($animals), $index = key($animals); 
       $animal; 
       $animal = next($animals), $index = key($animals)) {
  print "$index:";
  var_dump($animal);
  next($animals);
} 

输出:

0:string(3) "cat"
2:string(5) "horse"

当您实际在阵列中来回移动时,使用像foreach这样的直通迭代构造是非常误导的。上面的for循环在这方面更好,但不是很多;一个while循环,在循环体中明确列出所有细节,可能是最好的选择。

答案 2 :(得分:4)

Mark的解决方案非常接近,但如果数组包含0,false或“”等值,则在第二个for循环表达式中评估为false,则会失败。

此解决方案适用于所有阵列,并且更接近for循环的“精神”。第一个循环表达式中的reset()确保我们从数组的开头开始,这与foreach的情况一样。 for循环中的第二个表达式需要评估数组指针指向的元素是否存在。如果数组指针指向数组末尾或数组为空,则key()返回null。第三个表达式在每次迭代结束时使数组指针前进。

$animals = array('cat', 'dog', 'horse', 'elephant');
for (reset($animals); key($animals) !== null; next($animals)) {
    $animal = current($animals);
    var_dump($animal);
    next($animals);
}

输出:

string(3) "cat"
string(5) "horse"

答案 3 :(得分:0)

我认为因为他只想跳过元素,他可以使用'继续'结合foreach中的if子句。

$skip=array ('dog', 'elephant');
$animals = array('cat', 'dog', 'horse', 'elephant');
foreach($animals as $animal)
{
   if (in_array($animal, $skip)) {
       continue;
   }
   var_dump($animal);
}

这将输出:

string(3) "cat" 
string(5) "horse"

Variante 2没有继续具有相同的效果:

$skip=array ('dog', 'elephant');
$animals = array('cat', 'dog', 'horse', 'elephant');
foreach($animals as $animal)
{
   if (!in_array($animal, $skip)) {
        var_dump($animal);
   }

}

答案 4 :(得分:0)

&添加到值

foreach ($variable as $key => &$value) {

}

现在$value引用$variable[$key]地址

答案 5 :(得分:-1)

您不需要在foreach循环结束时手动递增指针 - 它会自动完成。你不需要任何东西:

foreach($animals as $animal) {
    var_dump($animal)
}