В чем причина ошибки в PHP7?

Здравствуйте!
Возникла проблема, версия php 7
Есть цикл в нем обрабатывается даты.
foreach ( $NewItems as $item) {
                    $st = $item->timestamp;
                    if(time() < $st){
                        exit();
                    }
                }

Так вот почему такая конструкция не работает.
Цикл не переходит к следующему элементу, а продолжает работать.
Хотя оба значения intriger!
Dump:
int(1511355333)
int(1505894400)
  • Вопрос задан
  • 191 просмотр
Пригласить эксперта
Ответы на вопрос 2
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
1. Не вижу необходимости помещать свойство объекта/класса в дополнительную переменную. Вместо:
$st = $item->timestamp;
if(time() < $st){

достаточно:
if( time() < $item->timestamp ) {

2. В PHP exit - это конструкт, и если в него не передается параметр, скобки необязательны (принято не указывать их): вместо exit(); достаточно exit;

3. Для выхода из цикла необходимо использовать break. Разница в том, что exit прекращает выполнение скрипта вообще, break - только выходит из цикла, прекращая дальнейшие итерации:
if( time() < $item->timestamp ) {
    break;
}


4. Возможно, вам вообще нужно просто прекратить логику в текущей итерации и перейти к следующей итерации (скипнуть текущий элемент в итерации) - для этого есть continue:
if( time() < $item->timestamp ) {
    continue;
}
// тут остальная логика в итерации цикла, 
// при выполнении условия и вызове continue; эта логика для текущей итерации не будет выполнена, 
// произойдет переход к следующей итерации цикла
...


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

6. Что касается "почему такая конструкция не работает":

– ваш дамп, это значения $item->timestamp?
– вы уверены что условие проверки верное, в вашем коде текущий unix timestamp должен быть меньше $item->timestamp, то есть последний должен содержать timestamp в будущем. Рискну предположить, что на самом деле вам необходимо:
if( $item->timestamp < time() ) {
    continue;
}
Ответ написан
Комментировать
KazeZlat
@KazeZlat
Погромист-затейник
Если вам нужно пропустить даты в будущем (и после if'a у вас есть какой-то код, который вы не приложили), то нужно использовать continue;, который перейдет к следующей итерации, а не exit;, который прерывает выполнение скрипта. А еще можно сделать так:
$NewItems = array_filter($NewItems , function($element){
    return $element->timestamp < time();
});
foreach ($NewItems as $item) {
    // Code...
}

Так будет понятнее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы