У меня есть следующий код, взятый из руководства PHP по записям curl_multi_ *:
$active = null; do { $process = curl_multi_exec($curl, $active); } while ($process === CURLM_CALL_MULTI_PERFORM); while (($active >= 1) && ($process === CURLM_OK)) { if (curl_multi_select($curl, 3) != -1) { do { $process = curl_multi_exec($curl, $active); } while ($process === CURLM_CALL_MULTI_PERFORM); } }
Теперь дело в том, что мне действительно не нравится писать … в то время как циклы, и мне было интересно, что будет лучшим и более коротким способом добиться того же, но без использования таких петель.
До сих пор я придумал немного более длинную версию, но я не уверен, что она делает то же самое или если она работает так же, как и исходная:
while (true) { $active = 1; $process = curl_multi_exec($curl, $active); if ($process === CURLM_OK) { while (($active >= 1) && (curl_multi_select($curl, 3) != -1)) { $process = CURLM_CALL_MULTI_PERFORM; while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); } } break; } else if ($process === CURLM_CALL_MULTI_PERFORM) { continue; } break; }
Заранее спасибо.
Do..While
петли близки к Do..While
While
, за исключением того, что они обеспечивают код внутри цикла Do..While
выполняется хотя бы один раз. Таким образом, простой способ конвертировать Do..While
циклы – это вытащить код из Do..While
чтобы он Do..While
один раз и преобразовывался в While
.
do { action(); } while(...)
эквивалентно:
action(); while(...) { action(); }
Поэтому для вашего кода это изменение будет выглядеть так:
$active = null; $process = curl_multi_exec($curl, $active); while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); } while (($active >= 1) && ($process === CURLM_OK)) { if (curl_multi_select($curl, 3) != -1) { $process = curl_multi_exec($curl, $active); while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); }; } }
С учетом сказанного, нет ничего плохого в Do..While
циклы, и вы должны использовать их, если вам нужно.
Я не вижу проблемы с do while while. Они должны использоваться, когда код внутри циклов содержит что-то, что должно выполняться как минимум 1 раз и более раз, если условие выполнено.
ИМО, я думаю, что ваш первый набор кода более ясен.
Будет ли это делать?
$active = null; $process = curl_multi_exec($curl, $active); while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); }; $process = curl_multi_exec($curl, $active); while (($active >= 1) && ($process === CURLM_OK)) { if (curl_multi_select($curl, 3) != -1) { while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); } } }