$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
всегда кажется правдой. Я просто не могу найти ошибку.
(Еще немного текста для возможности отправки. Еще немного текста для возможности отправки. Еще немного текста для возможности отправки.)
strtotime('+1day')
будет использовать «сейчас», например 3:35 вечера как базовое время, так что вы делаете эквивалент
$now = time(); // 1448400979
$tomorrow = strtotime('+1 day', $now); // 1448487379
while(!isset($arr[$tomorrow])) { ... }
Поскольку это значение вряд ли когда-либо будет в вашем массиве в качестве ключа, ваш цикл никогда не заканчивается. Вам нужно сделать сравнение> = или что-то еще, чтобы проверить, когда ваша рассматриваемая в настоящее время дата становится больше любого ключа в вашем массиве.
В начале вашего скрипта вы устанавливаете время на текущее время. Затем в цикле 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 до полуночи