У меня есть следующий цикл while, который сравнивает 2 даты, чтобы увидеть, является ли 1 меньше другого, а если нет, то добавляется неделя к первой дате.
Он отлично работает, однако там, где существует большая разница между датами (т.е. более 12 месяцев), я получаю ошибку таймаута, поскольку она прошла максимальное время выполнения.
Может ли кто-нибудь помочь мне сделать это более эффективным?
while($startDate->timestamp < $current_week->timestamp){ $data['weeks'][$w] = array( 'monday' => $startDate->startofWeek()->format('d/m/Y'), 'sunday' => $startDate->endofWeek()->format('d/m/Y') ); $w++; $startDate = $startDate->addDays(7); // Move it on to the following week }
Я должен добавить, что я работаю с расширением API Carbon для DateTime
благодаря
—-Редактировать—-
Что-то странное происходит, что я не понимаю. Если я передаю дату, жестко закодированную до $ startDate, все после 2013-01-06 работает отлично (и быстро), но как только после этой даты истечет время. Какие-нибудь идеи?
Похоже, вы делаете немного больше $startDate
чем вы ожидаете – вы ->startOfWeek()
объект с помощью ->startOfWeek()
и ->endOfWeek()
а не просто вычисляете вывод строки; мое чтение источника для Carbon – это то, что каждый метод, который вы вызываете, изменяет объект, поэтому назначение в последней строке вашего цикла while не нужно (его можно так же легко записать как $startDate->addDays(7);
в результате ваш код немного менее эффективен, чем может быть, и может даже зацикливаться в один или два раза больше, чем вы хотите.
Тем не менее, я бы заподозрил, что этот блок кода не является вашей реальной проблемой, и что это еще дальше по вашей кодовой базе – если ваши проблемы растут с размером $ data ['weeks'], то это, вероятно, что-то в том, переработать его для вашего HTML.