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

Sta*_*bie 4 php

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

上面的代码输出:猫,狗,马,大象.我认为该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
Run Code Online (Sandbox Code Playgroud)

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

hak*_*kre 9

你可以创建一个ArrayIterator文档seekable文档.

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

foreach ($iterator as $current) {
    $iterator->next();
}
Run Code Online (Sandbox Code Playgroud)

它应该提供你需要的所有东西.如果没有,您也可以自己将需求封装Iterator文档中.


Mar*_*eed 6

你不应该混合foreach直接指针访问.如果你想在数组中移动,只需用foreachC风格替换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);
} 
Run Code Online (Sandbox Code Playgroud)

输出:

0:string(3) "cat"
2:string(5) "horse"
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*sel 6

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);
}
Run Code Online (Sandbox Code Playgroud)

这输出:

string(3) "cat"
string(5) "horse"
Run Code Online (Sandbox Code Playgroud)