Функция не заканчивается

$time = time();

$foo = array(
1448319600 => array(
array(
'foo' => 'bar'
),
array(
'bar' => 'foo'
)
),
1448578800 => array(
array(
'foo2' => 'bar2'
),
array(
'bar2' => 'foo2'
)
)
);

function bar($time, $foo) {
$count = 0;
do {
$count++;
$time = strtotime('+1 day', $time);
} while (isset($foo[$time]) === false);
return array(
'count' => $count,
'foo' => $foo[$time]
);
}

bar($time, $foo);

Это загрузка и загрузка и загрузка, потому что isset($foo[$time]) === false всегда кажется правдой. Я просто не могу найти ошибку.

(Еще немного текста для возможности отправки. Еще немного текста для возможности отправки. Еще немного текста для возможности отправки.)

1

Решение

strtotime('+1day') будет использовать «сейчас», например 3:35 вечера как базовое время, так что вы делаете эквивалент

$now = time(); // 1448400979
$tomorrow = strtotime('+1 day', $now); // 1448487379
while(!isset($arr[$tomorrow])) { ... }

Поскольку это значение вряд ли когда-либо будет в вашем массиве в качестве ключа, ваш цикл никогда не заканчивается. Вам нужно сделать сравнение> = или что-то еще, чтобы проверить, когда ваша рассматриваемая в настоящее время дата становится больше любого ключа в вашем массиве.

3

Другие решения

В начале вашего скрипта вы устанавливаете время на текущее время. Затем в цикле do while вы увеличиваете время на один день каждый раз, когда оно повторяется. isset($foo[time]) === false вернет значение false и выйдет из цикла, когда ваше время начнется ровно в 11 вечера. Mon, 23 Nov 2015 23:00:00 +0000 или же Thu, 26 Nov 2015 23:00:00 +0000,

Примером является отметка времени при написании этого поста: 1448401349 Если я добавлю к нему один день, я получу 1448487749.

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

1

По вопросам рекламы [email protected]