2014-07-07 4 views
0

Я использую goto, если есть какие-либо ошибки, и он начнется снова наверху.Заменить goto into while loop?

Я также не могу использовать goto в функции для перехода за пределы функции.

Я знаю goto Плохо, но как бы while цикл вписывался в мой код?

Например:

$ch = curl_init(); 

retry: 

$result = curlPost($ch, "home.php", http_build_query($arg)); 

if (strpos($postResult, "Welcome") !== false) { 
    sleep(10); 
    goto retry; 
} 

$sql = "SELECT * FROM data"; 
$q = mysql_query($sql) or die(mysql_error()); 

while($row = mysql_fetch_assoc($q)) { 
    $name['something'] = $row['name']; 
    submitData($ch,$name); 
} 


function submitData($ch,$name) { 

    $result2 = curlPost($ch, "submit.php", http_build_query($name)); 

    if (strpos($postResult, "Website close") !== false) { 
     sleep(10); 
     goto retry; //goto wouldnt work. 
    } 

    // do something here 
} 
+0

Он подойдет лучше, чем goto. – Phantom

+0

@Phantom Сообщение ответ, используя 'while' цикл с моим примером. – user1246800

ответ

1

В принципе, вы бы что-то вроде этого:

$success = false; 
while(!$success) { 
    // do stuff here 
    // psuedocode follows: 
    if failure { 
     continue; // skip remainder of `while` and retry 
    } 
    if complete { 
     $success = true; // loop will end 
     // or "break;" to exit loop immediately 
    } 
} 

Просто надо знать, что если ваш «если неисправность» сама внутри цикла, то вам нужно continue 2; , Или, если вы находитесь в вложенном цикле, continue 3; и так далее.

+0

Спасибо, это было полезно. Я думаю, мне удалось заменить мой пример использованием цикла while. Не могли бы вы проверить, правильно ли это? http://pastebin.com/U5Bpkt7A – user1246800

+0

Почти. Просто 'false' typo'd как' flase', и вам не нужно '$ tryAgain'. Также повторить попытку с логикой 'submitData' было назад. [Попробуйте это] (http://pastebin.com/yGS8Dmgv) –