PHP Foreach, который повторяется - PullRequest
2 голосов
/ 07 февраля 2012

У меня проблема с 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 голосов
/ 05 февраля 2013

Вы не можете использовать prev ($ array) в цикле foreach, как уже было сказано Вы должны либо повторить цикл while или for

Но помимо этого, вы все равно столкнетесь с некоторыми другими проблемами ...

php - очень линейный язык, пока код находится внутри, такой цикл, он не может делать ничего другого, поэтому этот php должен работать как отдельный поток, и, поскольку он должен что-то делать (возвращать значение), он будет блокироваться. не только сам, но и поток, чтобы поймать это значение тоже. И, скорее всего, через некоторое время он сломается, вы можете увеличить время выполнения скрипта php max в этом цикле, чтобы он не умирал, но вы должны сделать то же самое и с геттером ... вам не следует делать что-то подобное (вот почему здесь нет кода)

Так что, если я вас правильно понял, вы хотите получить доступ к файлу на удаленном сервере ...

Вы могли бы просто:

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

Это также будет заблокировано внутри цикла, пока $ handle не установлен ИЛИ не установлен в ЛОЖЬ и это позволит вашему сценарию умереть после максимального времени исполнения (обычно 60 секунд) Как только $ handle установлен в дескриптор файла для вывода html удаленных серверов (в данном случае), он будет выполнять весь следующий код в обычном режиме Если вы закончили читать $ handle, не забудьте закрыть его с помощью

fclose($handle);
0 голосов
/ 16 мая 2018
$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
0 голосов
/ 07 февраля 2012
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";    
}
0 голосов
/ 07 февраля 2012

Я думаю, что вы после чего-то вроде этого:

<?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, вв этом случае может иметь смысл ограничить попытки выполнения определенного условия, а не ограничения для всего массива, но вы лучше знаете свои требования и можете обратиться за дополнительной помощью, если хотите.

0 голосов
/ 07 февраля 2012

Foreach идеально подходит для массивов, так как skynorth упоминается с конечным размером.

Для этого я бы порекомендовал цикл Do While, который гарантирует по крайней мере одно выполнение цикла, позволяющее вам выполнять проверки на сервере.

0 голосов
/ 07 февраля 2012

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

Задача № 1:

При первом запуске foreach внутренний указатель массива автоматически сбрасывается на первый элемент массива

Таким образом, ваш первый вызов next () бесполезен.

Задача № 2:

Поскольку foreach полагается на внутренний указатель массива, изменение его в цикле может привести кнеожиданное поведение.

0 голосов
/ 07 февраля 2012

Это соответствует вашим потребностям:

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