проблема петли с goto в php - PullRequest
1 голос
/ 04 июня 2011

Я запрограммировал скрипт с помощью команды goto, но на сервере, где я хочу выполнить скрипт, есть предыдущая версия PHP (<5.3), поэтому я должен изменить код. Структура кода выглядит так: </p>

for($i = 0; $i < 30; $i++)  // print 30 articles 
{
    $x = 0;
    // choose a a feed from the db
    // parse it

    a:
    foreach($feed->get_items($x, 1) as $item)
    {
        // create a unique id for the article of the feed

      if($id == $dbid)
      {
          // if this id exists in the db, take the next article of the same feed which is not in the db 
          $x++;
          goto a;
      }
      else
      {
          // print the original article you grabbed
      }

   } // end of foreach
} // end of for

Я все проверил. Есть ли у вас какие-либо идеи, как я могу преобразовать этот код без goto для правильного выполнения ???

Ответы [ 5 ]

2 голосов
/ 04 июня 2011

Этот вопрос показывает, почему следует избегать goto. Это позволяет вам уйти, не задумываясь об алгоритме.

Стандартный способ сделать это с помощью флага. Я надеюсь, что вы не ожидали ответа типа herezthecode kthxbai, но в этом случае лучший способ объяснить это - написать код -

for($i=0;$i<30;$++){
  $x=0;
  do {
    $found = false;
    foreach($feed->get_items($x,1) as $item){
      // get $id
      if($id==$dbid){
        $found = true;
        break;
      }else{
        // other things
      }
    }
    $x++;
  } while($found);
}
1 голос
/ 04 июня 2011

Не зная, как ведет себя вызов ->get_items(), вы можете использовать этот метод грубой силы вместо goto-switch:

for($i = 0; $i < 30; $i++)
{
    $x = 0;


    $a = 1;
    while ($a--)
    foreach($feed->get_items($x, 1) as $item)
    {

      if($id == $dbid)
      {
          $x++;
          $a=1; break;
      }
      else
      {
      }

   } // end of foreach
} // end of for

Метка заменяется while и условием самоисполняющегося останова. И goto становится перерывом и сбрасывает условие остановки $a.

0 голосов
/ 04 июня 2011

Переместите объявление $ x за пределы цикла for и замените комбинацию label / goto разрывом, например ...

    $x=0;
    for($i=0;$i<30;$++)  //print 30 articles 
    {
     foreach($feed->get_items($x,1) as $item)
     {
       //  create a unique id for the article of the feed
       if($id==$dbid)
       {
       //if this id exists in the db,take the next article of the same feed which is not in the db 
          $x++;
          continue;
       }
       else
       {
         //print the original article you grabbed
       }

     } // end of foreach
   }//end of for
0 голосов
/ 04 июня 2011

Согласитесь с unset - использование break прервет цикл if и продолжит цикл for

0 голосов
/ 04 июня 2011

Что-то вроде этого, вероятно, будет работать ...

function loop(){
  foreach($feed->get_items($x,1) as $item){
    if($id==$dbid){
      $x++;
      loop();
    }else{

    }
  }
}
for($i=0;$i<30;$++){
  $x=0;
  loop();
}

Извините, я удалил все комментарии, они раздражали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...