Как поместить два get запроса в одну функцию с ожиданием разных ответов?

Так всё легко начиналось, а сейчас я уже не хочу помещать два GET запроса в одну функцию, но теперь у меня уже дело принципа. Если бы я знала, что я просижу над этой строчкой 6 часов - я бы сразу плюнула и сделала две отдельные функции.

Есть GET запрос сервер. Точнее их два: первый запрос возвращает ID, второй запрос по полученному ID возвращает данные. Проблема в том, что результаты запросов имеют несколько видов: у первого запроса: id и error (если id не получен) у второго запроса: 0 - (ошибка), 1 - (успешно), 2 - (данные подготавливаются, сделайте запрос позже)

function curl($method, $request) {
$a = 1;

do {
echo "---запуск---";
$ch = curl_init("https://server/$method/$request");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = json_decode(curl_exec($ch));

print_r($result);
$status = $result->status;
$id = $result->id;

if ($a > 3) break 1; // если более трёх запросов, то останавливаем цикл
sleep(3); $a = $a+1;

}while ($method == "result" ? $status != 1 : !$id);

curl_close($ch);
return $result;
}
echo "Первый запуск";
$resultCurl = curl("first", $data);
echo "Второй запуск";
$resultCurl2 = curl("second" $resultCurl->id);

Вся проблема в строчке:

}while ($method == "first" ? !$id : $status != 1);

Мне нужно, чтобы в первом запросе цикл повторялся, пока я не получу id, а во втором случае: пока Status не будет равен 1...

Как блин такое сделать?

Я специально делаю ошибку, чтобы результат не смог обработаться, но почему-то я вижу:

Первый запуск
---запуск---
---запуск---
---запуск---
---запуск---
Второй запуск
---запуск---

Хотя я должна после второго запуска видеть снова 4 раза "---запуск---"


Ответы (1 шт):

Автор решения: kachulin

Вся проблема в строчке:

}while ($method == "first" ? !$id : $status != 1);

Думаю, эта строчка может выглядеть примерно так.

}while (($method == "first" && !isset($result->id)) || ($method == "second" && !$result->status));

А вообще странная конструкция кода, например цикл do{....}while не помню чтобы где-то применялся в php. Вариант приведенный ниже мне более понятен

<?php
function curl($method, $request) {
    $a = 0;
    while ($a++ < 4) {
        echo "---method-$method---<br>";

        $ch = curl_init("https://server/$method/$request");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = json_decode(curl_exec($ch));

        if ($method == 'first' && isset($result->id)) {//если id существует, то функция вызывает сама себя с другим параметром
            return curl('second', $result->id);
        }
        if ($method == 'second' && $result->status) {//если status не равен 0, возвращаем результат
            return $result;
        }
        sleep(3);
    }
    return false;//если исчерпаны все попытки возвращаем false
}

if ($result = curl('first', $data)) {
    var_dump($result);
}
else {
    echo 'Попытки исчерпаны';
}
→ Ссылка