PHP Foreach重复自己

时间:2012-02-07 13:40:33

标签: php for-loop foreach iteration

我遇到了一个foreach的问题,他的主要建议是检查服务器是否已启动,然后访问该文件,并且我被困在一个foreach上,我想让它重复一步。例如,我有以下代码:

<?php
$Array = array("one","two","tree","four");
next($Array); 

$i = 0;
foreach($Array as $Key=>$Value)
{
    $i++;
    echo "Key=".$Key." VAL=".$Value."<br>";

    if($Key==2) prev($Array);

    if($i==10) break;
}
?>
输出的

Key=0 VAL=one
Key=1 VAL=two
Key=2 VAL=tree
Key=3 VAL=four

我想让它输出

Key=0 VAL=one
Key=1 VAL=two
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree // till the $i is 10 therefore it's exits the foreach trough break;

我尝试过prev($ Array);没有结果。

我一直在考虑

while(true)
{
    if(server exists)
    {
         echo "server is good";
         break;
    }
    else
    {
         echo "server is BAD ... continueing";
         prev($Array);
    }
}

但这对我来说也不起作用...... 任何人都可以帮我解决这个问题吗?

7 个答案:

答案 0 :(得分:0)

这符合您的需求:

$arr = array('one', 'two', 'three', 'four');
$val = null;
for ($i = 0; $i < 10; $i++) {
  if (isset($arr[$i])) {
    $val = $arr[$i];
  }
  echo 'key=' . $i . ' val=' . $val . '<br />';
}

答案 1 :(得分:0)

http://php.net/manual/en/control-structures.foreach.php

问题#1:

  

当foreach首次开始执行时,内部数组指针会自动重置为数组的第一个元素

因此,你的第一个next()调用是无用的。

问题#2:

  

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

答案 2 :(得分:0)

Foreach非常适合像skynorth一样有限大小的数组。

为此,我建议使用Do While循环,它保证至少执行一次循环,允许您在服务器上进行检查。

答案 3 :(得分:0)

我认为你是在追求这样的事情:

<?php
$myArray = array('one','two','tree','four');
$length = count($myArray );
$attempts = 0;

for ($i = 0; $i < $length; ++$i) {
    echo 'Key=' . $i . ' VAL=' . $myArray[$i] . '<br>';
    if ($i === 2) {
        --$i;
    }

    if (attempts >= 10) {
        break;
    }
    ++$attempts;
}
?>

注释

无论数组大小如何,都会在10次迭代后结束。如果您的阵列长度为20个项目,那么这是行不通的。

我假设你有一些你希望使用的实际条件,而不是检查一个密钥为2的项目,在这种情况下,限制特定条件下的尝试可能更有意义,而不是限制整个阵列 - 但你最了解你的要求,如果你想要它可以寻求更多的帮助。

答案 4 :(得分:0)

for ($i = 0; $i < count($Array) - 2; $i++) {
     echo "Key=$i VAL={$Array[$i]}\n";
}
for ($j = $i; $j < 10; $j++) {
     echo "Key=$i VAL={$Array[$i]}\n";    
}

答案 5 :(得分:0)

正如前面所述,你不能在foreach循环中使用prev($ array) 你应该用while或for循环迭代

但除此之外,你还会遇到其他麻烦......

php是一种非常线性的语言,只要代码是INSIDE这样的循环它就不能做任何其他事情所以这个php必须作为一个单独的线程运行,并且因为它应该做某事(返回一个值)它会锁定不仅仅是本身,而是抓住这个价值的线索。 并且它很可能会在一定时间后中断,你可以在该循环中扩展php max脚本执行时间以防止它死亡,但你也必须对getter做同样的事情..你不应该做那样的事情(这就是为什么这里没有代码)

所以,如果我说得对,你想要访问远程服务器上的文件......

你可以简单地说:

while (!$handle) // file not opened i.e. server not accessible
{
    $handle = fopen("http://www.example.com/", "r"); //try to fopen file
}

只要未设置$ handle或将其设置为FALSE,它也将被锁定在循环内 并且它会让你的脚本在最长执行时间后死亡(通常为60秒) 一旦$ handle被设置为远程服务器html输出的文件句柄(在这种情况下),它将正常执行以下所有代码 如果你已经完成阅读$ handle,请不要忘记用

关闭它
fclose($handle);

答案 6 :(得分:0)

$Array = array("one","two","tree","four");

$i = 0;
foreach($Array as $Key=>$Value)
{
    $count = 0;
    // Registra a referência do
    start:

    $i++;
    echo "Key=".$Key." VAL=".$Value."\n";

    if($Key == 2 && $count < 10) {
      // Count
      $count++;
      // Return to start loop
      goto start;
    }
}

// OUTPUT

Key=0 VAL=one
Key=1 VAL=two
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=2 VAL=tree
Key=3 VAL=four