LINUX.ORG.RU

Что-то странное с continue

 , continue, ,


0

1

Помогите понять поведение скрипта.

Есть два вложенных foreach-цикла, внутри вложенного - условие, при выполнении которого делается continue; . Задумано, что оно должно продолжить внутренний цикл. Но почему-то этого не происходит - скрипт прерывается вовсе. Краткий квотез:

foreach($dates as $pppricedate) {
   foreach($array as $value) {
      // skipped
      $test = system("7z t $curpath/".$value['date'].".zip | grep xls");
      if (trim($test) == "") {
         echo "!!!";
         continue;
      }
      // skipped
   }
}

т.е. условием я проверяю архив на наличие Эксель-файла. Если нету - нужно продолжить цикл в следующей итерации.

Путем принт-отладки выяснил, что первый и единственный раз процесс до условия доходит на самой последней итерации внутреннего цикла. Т.е., по всей логике, после continue должна начаться следующая итерация верхнего цикла (внутренний уже закончился).

Что я делаю не так? Что я не понимаю?

★★★★★

Последнее исправление: bvn13 (всего исправлений: 1)

Т.е., по всей логике, после continue должна начаться следующая итерация верхнего цикла (внутренний уже закончился).

Нет, continue скипает итерацию в текущем цикле.

Dantix ★★
()
Ответ на: комментарий от Dantix

ну а если во внутреннем цикле нет итераций, то инкрементируется итерация внешнего, а внутренний - сбрасывается. Уж что-что, а работу континуя я себе представляю. представлял. до сегодня...

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

если во внутреннем цикле нет итераций, то инкрементируется итерация внешнего
во внутреннем цикле нет итераций
в цикле нет итераций

Во-первых, тогда никакого continue не произойдет, а во-вторых, кажется, я понял, в чем секрет дурной славы пхпшников. В том, что так оно все и есть.

cdshines ★★★★★
()
Ответ на: комментарий от stevejobs

http://yadi.sk/d/Hbk1HoZC9qcVG

Строка 170 файла autoload.php

PS. За процедурный говнокод не пинайте. Сам знаю. Писал, когда учил пхп и еще не понимал сути вещей. А когда понял их, понял, что на пхп больше писать не хочу :) Поэтому пока поддерживаю as is.

ЗЗЫ. Запускать

php autoload.php

никаких веб-страниц нету. Это по крону запускается.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от cdshines

я не пхп-шник более. хватило мне. и да, что непонятного из моего сказанного? Цикл на последней итерации, значит, в нем их больше не будет. Т.е. при попытке сделать континуй этот цикл заканчивается, продолжается внешний.

bvn13 ★★★★★
() автор топика

умвр

<?php

$a = array(1, 3, 5, 7);
$b = array(0, 2, 4, 6);

foreach($a as $v1) {
   foreach($b as $v2) {
      echo "++ $v1 $v2\n";
      if ($v1 + $v2 == 5) {
         echo "!!!\n";
         continue;
      }
      echo "-- $v1 $v2\n";
   }
}

?>
x0r ★★★★★
()
Последнее исправление: x0r (всего исправлений: 1)
Ответ на: комментарий от x0r

а там разрешены манипуляции с файловой системой? у меня - парсинг хтмл, закачка архивов, распаковка...

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

запустил. До строчки «echo »\n\n======> PROCESSING FILE #".($ccc++)." <======\n\n";" доходит только на самой последней итерации. На 11м заказе. В остальных случаях - НЕ доходит! Т.к. итерация последняя, все циклы закончены, вот он и выходит изо всех.

stevejobs ★★★★☆
()

Поставь PHPStorm (или IntelliJ IDEA Ultimate с плагином PHP), посмотри в мануале как включить отладку и дебажь сам =)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Да, это внутренний цикл закончен, но это только первая итерация внешнего из 12-ти :(

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

первая итерация внешнего из 12-ти

это в конце первой итерации которого написано return true? =) Ну да, он сделает одну итерацию, споткнется об return true и выйдет - всё по написанному

кстати, если ты вдруг хочешь сделать continue не на внутренний foreach, а сразу на внешний, юзай «continue 2»

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

а если под return true в конце итерации ты подразумевал, что for должен вернуть значение, и типа несколько последовательных вызовов for'а сделают тебе сиквенс из двенадцати штук true, то тебе нужно взять язык программирования вместо php. ну либо не выделываться и складывать это как все приличные пхпшники - в глобальный массив или что-то такое)

stevejobs ★★★★☆
()
Ответ на: комментарий от bvn13

ЯННП. Уточни это

во внутреннем цикле нет итераций

Если ты имеешь ввиду, что continue срабатывает на последнем элементе во внутреннем цикле, то

ну а если во внутреннем цикле нет итераций, то инкрементируется итерация внешнего, а внутренний - сбрасывается.

убери из этой ситуации continue и ты внезапно получишь тоже самое.

Если ты имеешь ввиду случай, когда во внутренем цикле нету элементов вообще, то ты не зайдешь в тело цикла и опять таки перейдешь к следующей итерации внешнего цикла.

Dantix ★★
()
Ответ на: комментарий от stevejobs

убил час на настройку своего Eclipse и XDebug. Бестолку.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от Dantix

я имел в виду, что внутренний цикл находится на своей последней итерации и в нем БОЛЬШЕ не будет итераций - он в завершающей стадии.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

я просто пробежался отладчиком и посмотрел, где он выходит из скрипта)

(Настройка заключается в том, чтобы а) установить пакет с xdebug б) скопипастать несколько строчек уже готового конфига в php.ini в) в браузере поставить плагин для активации дебага и прописать в настройки плагина автоактивацию на твой сайт г) в IDE прописать IDE_KEY тот же самый что в php.ini и плагине для браузера. PHPStorm/IDEA, емнип, в режиме отладки скрипта может обойтись и без плагина к браузеру, но проверять это выпиливанием xdebug'а не решусь :3)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

1) xdebug поставил, 2) строчки скопипастил 3) эклипс настроил по их манам.

имею дулю. could not start session.

ключ поставил xdebug_extension_ebug_ts

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

ну... эклипс не использую, да и ОС у тебя почти наверняка не арчлинукс, так что разбирайся сам)

stevejobs ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.