给出以下代码
<?php
$a = array(1,2,3,4,5,6);
$c=0;
foreach($a as $v){
if($v==5&&$c==0){
$c=1;
reset($a);
}
var_dump($v);
}
如何重置指针以便打印1,2,3,4,5,1,2,3,4,5,6?
我知道在这种情况下我可以简单地
<?php
$a = array(1,2,3,4,5,6);
$c=0;
for($i=0;$i<count($a);++$i){
$v = $a[$i];
if($v==5&&$c==0){
$c=1;
$i=-1; //because of the loop ++$i
}
var_dump($v);
}
但是我有一个更复杂的代码片段,解决方案并不像重写循环那样简单(不是数字键)。
那里的任何PHP大师可以帮助我吗?
答案 0 :(得分:6)
记录在案:
注意:当foreach首次开始执行时,内部数组指针会自动重置为数组的第一个元素。这意味着您不需要在foreach循环之前调用reset()。
由于foreach依赖于内部数组指针,在循环内更改它可能会导致意外行为。
http://php.net/manual/en/control-structures.foreach.php
不确定&#34;意外行为&#34;是的,因为我从来没有尝试过这个...但是手动使用每个()可能更安全......在你的代码中也更清晰。
reset($a);
while(list($key, $val) = each($a)) {
if($val==5&&$c==0){
$c=1;
reset($a);
}
var_dump($val);
}
解释了Foreach问题
我以为我之前已经看过你不能依赖foreach中的内部指针...但这次在文档中找不到它......只有&#34;意外结果& #34 ;.但是,感谢评论者,我发现以前的文本是在foreach中:
除非引用了数组,否则foreach 对指定数组的副本进行操作,而不是对数组本身进行操作。 foreach对数组指针有一些副作用。在foreach期间或之后不要依赖数组指针而不重置它。&#34;
http://php.net/manual/en/control-structures.foreach.php#114759
答案 1 :(得分:2)
如果您是OOP的粉丝,可以使用ArrayIterator类。
它的方法rewind()
与reset()
function。
$a=array(1,2,3,4,5,6);//or $a=range(1,6);
$i=new ArrayIterator($a);
$c=0;
foreach($i as $k=>$v)
{
if($v==5&&$c==0)
{
$c=1;
$i->rewind();
}
var_dump($v);
}
unset($i);//delete the iterator, to free memory
您可以在http://writecodeonline.com/php/或http://sandbox.onlinephpfunctions.com/
上在线测试@KevinNelson的答案是正确的方法,但对于未经训练的人来说,这一点并不明显。
此代码存在问题。
由于迭代,数字1不会在第二次回响。
但我有2个 franken-solutions !
解决方案1:使用方法next()
跳过可忽略的元素
$a=array(0,1,2,3,4,5,6);//or $a=range(0,6);
$i=new ArrayIterator($a);
$c=0;
$i->next();//jumps over the 1st element
foreach($i as $k=>$v)
{
if($v==5&&$c==0)
{
$c=1;
$i->rewind();
}
var_dump($v);
}
unset($i);
解决方案2:使用&#39; falsy&#39;创建一个元素价值(0
,null
,false
,''
...)并在循环中忽略它
$a=array(0,1,2,3,4,5,6);//or $a=range(0,6);
$i=new ArrayIterator($a);
$c=0;
foreach($i as $k=>$v)
{
if($v==5&&$c==0)
{
$c=1;
$i->rewind();
}
if($v)var_dump($v);
}
unset($i);