Как заставить цикл do while работать правильно?

12
V
На сайте с 04.06.2014
Offline
54
906

Для получения информации по последним сделкам из amoCRM используется метод GET leads/list. Использую цикл do while. Если количество элементов в массиве, который мы получаем, меньше или больше 500, то цикл работает нормально и заканчивает работу, когда получен массив с последними сделками (от 1 до 499). Если же элементов в массиве 500, то цикл работает бесконечно, и не останавливается, хотя должен остановиться, так как в последнем полученном массиве количество элементов равно 0 ($count_leads). Как заставить цикл работать правильно?

$limit_offset = 0;


do
{

$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/leads/list?limit_rows=500&limit_offset='.$limit_offset;
$curl=curl_init(); #Сохраняем дескриптор сеанса cURL
#Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
curl_setopt($curl,CURLOPT_URL,$link);
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);

$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
curl_close($curl);
CheckCurlResponse($code);
if($out)
{
$Response=json_decode($out,true);
$leads_list = $Response['response']['leads'];
}

$count_leads = count($leads_list);
$limit_offset = $limit_offset+500;

}
while ($count_leads == 500);
Партнёрка №1 в essay-нише (https://goo.gl/YfTPtG)
Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

Заставлять не нужно, такая простая конструкция не может работать неправильно, иначе бы все заметили :)

Сделайте echo $count_leads в цикле и посмотрите, в чём дело.

Например, если в одной из итераций curl_exec отработает с ошибкой, тогда $leads_list не будет установлен, а count() вернет 1 или 0.

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
V
На сайте с 04.06.2014
Offline
54
#2

В том то и дело, что $count_leads вывожу на экран для проверки.

echo $count_leads бесконечно показывает 500.

Также $leads_list вывожу на экран, и в каждой итерации цикла выводятся одни и те же 500 элементов массива.

Уже голову сломал, ничего понять не могу.

2
На сайте с 13.02.2012
Offline
92
2de
#3

А что Вам отдает сервер? Вы уверены что запрос получается правильный, не может быть так что последний запрос получается неправильный и сайт пытается его обработать из-за чего отдает предыдцщие данные.

Или, может быть так, что число записей кратно 500 и Ваш цикл будет работать постоянно для некоторых наборов данных.

V
На сайте с 04.06.2014
Offline
54
#4
2de:
А что Вам отдает сервер? Вы уверены что запрос получается правильный, не может быть так что последний запрос получается неправильный и сайт пытается его обработать из-за чего отдает предыдцщие данные.

Или, может быть так, что число записей кратно 500 и Ваш цикл будет работать постоянно для некоторых наборов данных.

Вряд ли последний запрос неправильный, так как если без цикла вручную прописать $limit_offset = 500, то $count_leads будет 0.

Число записей как раз равно 500. Но почему в этом случае цикл работает бесконечно,

если после взятия первых 500 записей $count_leads будет равен 500, а после взятия вторых 500 записей $count_leads будет равен 0. А 0 - это уже условие для прерывания цикла.

Только 0 в $count_leads никак не получается. Всегда $count_leads равен 500 (при 500 записях).

Flector
На сайте с 09.09.2006
Offline
186
#5

вы шутите?

условие же у вас прописано - повторять пока $count_leads == 500, вот оно и повторяется.

V
На сайте с 04.06.2014
Offline
54
#6
Flector:
вы шутите?
условие же у вас прописано - повторять пока $count_leads == 500, вот оно и повторяется.

или вам нужна справка по циклу do while?

Flector, А где я шучу?

$count_leads - это количество элементов в полученном массиве.

А при пятистах записях последний массив должен иметь 0 элементов

(первая итерация цикла: $count_leads == 500, вторая итерация: $count_leads == 0), а 0 !=500,

значит цикл должен прерваться.

Разве нет?

Flector
На сайте с 09.09.2006
Offline
186
#7

вы в запросе запрашиваете 500 элементов.

даже если они пустые.

count считает количество элементов, а не количество не пустых элементов.

вот и выходит, что всегда 500.

я так думаю, но могу ошибаться.

попробуйте через echo не $count_leads выводить, а $leads_list

V
На сайте с 04.06.2014
Offline
54
#8
Flector:
вы в запросе запрашиваете 500 элементов.
даже если они пустые.
count считает количество элементов, а не количество не пустых элементов.
вот и выходит, что всегда 500.

я так думаю, но могу ошибаться.

Вы ошибаетесь, я уже выше писал.

Если без цикла вручную прописать

$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/leads/list?limit_rows=500&limit_offset=500';

то $count_leads выведет 0.

Flector
На сайте с 09.09.2006
Offline
186
#9

я хз, обнулите $count_leads в начале цикла.

V
На сайте с 04.06.2014
Offline
54
#10
Flector:
я хз, обнулите $count_leads в начале цикла.

Ну а если ХЗ, то чего умничать?

Дело не в $count_leads. $leads_list постоянно в каждой итерации выводится тоже один и тот же (500 элементов).

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий