Почему прерывается цикл PHP ?

12
D
На сайте с 28.06.2008
Offline
1104
1009

Я паршу выдачу яндекса через оф. сервис XML лимитов

Делаю запрос, например $name = urlencode("ИНН Фирма");

И получаю 10 массивов.

Далее я начинаю перебирать каждый массив по очереди ища в нем определенный сайт, вот пример

if (!empty(strpos($array["response"]["results"]["grouping"]["group"][0]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][0]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][0]["doc"]["url"];
}
elseif (!empty(strpos($array["response"]["results"]["grouping"]["group"][1]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][1]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][1]["doc"]["url"];
}

Все работает, за одним нюансом - если в выдаче сайт site.ru будет несколько раз, а такое бывает часто

то у меня по идее сыграет последний по счету массив, где найдется совпадение, а это неправильно

ибо самый релевантный ответ первый. Ну и я подумал что в каждый if нужно вставить continue;

чтобы как только совпадение найдено, итерация переходила на следующую

Но словил необъяснимую фигную.

Делаю тестовый прогон с лимитом 5 (5 итераций), а в базу пишется одно значение, самое последние

else{

$inn = '0';

$url = 'non';

}

и все цикл заканчивается! Как это объяснить?

Я проверил, цикл спотыкается на первой итерации, а не последнюю в базу пишет.

Вот полный код (попробовал иф вместо елсеиф, тоже самое)

if (!empty($result)){
foreach ($result as $item) {

$name = urlencode("ИНН ".$item->name." ".$item->geo_code);
$name = str_replace(' ', '%20', $name);
$links = 'https://yandex.ru/search/xml?user=ltpm&key=****&query='.$name.'&l10n=ru&sortby=rlv&filter=none&groupby=attr%3D%22%22.mode%3Dflat.groups-on-page%3D10.docs-in-group%3D1';

$result = simplexml_load_file($links);
$json = json_encode($result);
$array = json_decode($json, true);

if (!empty(strpos($array["response"]["results"]["grouping"]["group"][0]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][0]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][0]["doc"]["url"];
continue;
}
if (!empty(strpos($array["response"]["results"]["grouping"]["group"][1]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][1]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][1]["doc"]["url"];
continue;
}
if (!empty(strpos($array["response"]["results"]["grouping"]["group"][2]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][2]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][2]["doc"]["url"];
continue;
}
if (!empty(strpos($array["response"]["results"]["grouping"]["group"][3]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][3]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][3]["doc"]["url"];
continue;
}
if (!empty(strpos($array["response"]["results"]["grouping"]["group"][4]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][4]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][4]["doc"]["url"];
continue;
}
if (!empty(strpos($array["response"]["results"]["grouping"]["group"][5]["doc"]["url"],'site.ru'))){
$json = json_encode($array["response"]["results"]["grouping"]["group"][5]);
preg_match('~(\s)(\d{10})([,|.|\s|!|)])~m', $json, $inn);
$url = $array["response"]["results"]["grouping"]["group"][5]["doc"]["url"];
continue;
}
else{
$inn = '111';
$url = 'non';
}

$db->setQuery("запись в базу");
$db->query();

}
}
IL
На сайте с 20.04.2007
Offline
435
#1

Так continue отправляет на "новый заход" в начало цикла, а "запись в базу" - в конце, до неё обработка в этом случае просто не доходит.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
D
На сайте с 28.06.2008
Offline
1104
#2

Блин вот я ступил, реально же, все обрывается на континуме, нужно просто запись в базу в иф поднять. Спасибо реально ступил.

IL
На сайте с 20.04.2007
Offline
435
#3

p.s. Я бы вот это вот многоразповторяющееся в цикл бы завернул..

Что-то вроде


foreach(strpos($array["response"]["results"]["grouping"]["group"] as $k => $g)
if (!empty($g["doc"]["url"],'site.ru'))){
$json = json_encode($g); // $array["response"]["results"]["grouping"]["group"][$k]
// ...
S3
На сайте с 29.03.2012
Offline
327
#4

Господа, извините сразу что влажу не по делу- хочу выразить искреннее восхищение и сочуствие - как вы это читаете??? Нам, питонистам такое не понять)))

Этот же код на питоне будет примерно в 2 раза короче и читабельнее. особенно с пандой

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

И напомните - зачем encode/decode обратно?

Z0
На сайте с 03.09.2009
Offline
782
#5
Sly32:
Господа, извините сразу что влажу не по делу- хочу выразить искреннее восхищение и сочуствие - как вы это читаете??? Нам, питонистам такое не понять)))
Этот же код на питоне будет примерно в 2 раза короче и читабельнее. особенно с пандой
Я бы даже в пыхе использовал бы отступы все таки - намного проще разбираться.
И напомните - зачем encode/decode обратно?

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

Samail
На сайте с 10.05.2007
Offline
366
#6
Sly32:
И напомните - зачем encode/decode обратно?

Видимо что-бы из объекта сделать массив.

Dreammaker
На сайте с 20.04.2006
Offline
569
#7
Sly32:
Этот же код на питоне будет примерно в 2 раза короче и читабельнее. особенно с пандой

Он и на PHP будет короче раза в 4-5, если не дублировать условие, а вынести в отдельную функцию (метод) и сделать цикл, как выше посоветовали.

S3
На сайте с 29.03.2012
Offline
327
#8
Dreammaker:
если не дублировать условие,

Это понятно, но кроме того в питоне панда раздербанит любой ответ одной строкой как надо

Dreammaker
На сайте с 20.04.2006
Offline
569
#9
Sly32:
в питоне панда

посмотрел на примеры для этой вашей панды - код не красивее того, что у Dram получается. :)

S3
На сайте с 29.03.2012
Offline
327
#10
Dreammaker:
посмотрел на примеры для этой вашей панды - код не красивее того, что у Dram получается. :)

Это кому как. Панда , драм, кому что удобнее

12

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