更换Do ...循环时

时间:2009-11-03 19:16:18

标签: php curl loops

我从curl_multi_ *条目的PHP手册中获取了以下代码:

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

提前致谢。

3 个答案:

答案 0 :(得分:8)

我没有看到do while循环的问题。当循环中的代码包含应该在满足条件时应该执行至少1次和更多次的内容时,应该使用它们。

IMO,我认为您的第一组代码更清晰。

答案 1 :(得分:5)

Do..While循环几乎与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循环没有任何问题,如果需要,你应该使用它们。

答案 2 :(得分: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);
        } 
    }
}