【问题标题】:PHP Foreach that repeats itself重复自身的 PHP Foreach
【发布时间】:2012-02-28 22:34:30
【问题描述】:

我遇到了一个 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);
    }
}

但这对我也不起作用... 谁能帮我解决这个问题?

【问题讨论】:

    标签: php for-loop foreach iteration


    【解决方案1】:

    这符合您的需求:

    $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 />';
    }
    

    【讨论】:

    • 这对我来说卡在“四”而不是“树”。
    • 它实际上是在重复 key=3 val=four ,假设服务器 2 已关闭,而服务器 4 在线......这对我没有帮助,主要原因是跳过离线服务器跨度>
    • 嗯,在他的例子中错过了那部分。我猜他只是想重复数组中最后找到的元素并继续重复它。如果他想在开始之前跳过最后一个简单的 array_pop() 应该可以解决问题。
    【解决方案2】:

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

    问题 #1:

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

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

    问题 #2:

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

    【讨论】:

      【解决方案3】:

      Foreach 非常适合像 skynorth 提到的有限大小的数组。

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

      【讨论】:

      • 正如我在thenewboston.org/watch.php?cat=14&number=9 看到的那样,虽然只是一会儿,上面有一些东西......我不明白他的逻辑......
      • do while 第一次执行大括号内的代码,然后进行比较。
      • 是的,就像正常的while,上面有一段代码
      • 否,因为有一段时间您的代码可能不会在第一轮执行,因此不会执行您“可能”需要执行的检查。
      • 我猜......好吧,但我解决了我的问题,而(真的)第二个例子
      【解决方案4】:

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

      <?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 的项目,在这种情况下,限制特定条件下的尝试可能更有意义,而不是限制整个阵列 - 但您最了解自己的要求,如果需要,可以寻求更多帮助。

      【讨论】:

        【解决方案5】:
        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";    
        }
        

        【讨论】:

        【解决方案6】:

        你不能在 foreach 循环中 prev($array) 就像已经说明的那样 您应该使用 while 或 for 循环进行迭代

        但除此之外,无论如何,您将面临其他一些麻烦..

        php 是一种非常线性的语言,只要代码在这样的循环中,它就不能做任何其他事情,所以这个 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);
        

        【讨论】:

          【解决方案7】:
          $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;
              }
          }
          

          // 输出

          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
          

          【讨论】:

            【解决方案8】:

            使用for() 迭代您的数组,以便您完全控制计数器变量的增量。

            在循环内调用您的服务器状态检查函数。如果服务器关闭,则从计数器中减去 0.9。 for() 中的 ++$i 将在下一次迭代中有效地添加 .1。这意味着在循环移动到下一个服务器之前,同一台服务器将进行多达 10 次检查。如果在达到 10 次尝试限制之前服务器已备份,只需将计数器设置为其截断的整数值,然后 for() 中的 ++$i 将前进到数组中的下一项。

            代码:(Demo)

            $servers = ["one", "two", "tree", "four"];
            
            function isServerDown($server) {
                return $server === 'tree';
            }
            
            for ($i = 0, $count = count($servers); $i < $count; ++$i) {
                $server = $servers[(int)$i];
                printf("Key=%d VAL=%s\n", $i, $server);
                $i = isServerDown($server) ? $i - .9 : (int)$i;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-13
              • 1970-01-01
              • 2014-01-31
              • 2018-12-11
              • 2019-02-11
              相关资源
              最近更新 更多