У меня есть целый ряд недель, недель и недель после даты, даты открытия и закрытия. По какой-то причине, когда цикл foreach достигает конечной даты, он выводит массив последней недели вместо окончательной даты. Вот начало массива:
$dates = Array ( [0] => Array ( [0] => Array ( [0] => "Mon 23rd June" [1] => "9:00am" [2] => "7:00pm" ) [1] => Array ( [0] => "Tue 24th June" [1] => "9:00am" [2] => "7:00pm" ) ... [1] => Array ( [0] => Array ( [0] => "Mon 30th June" [1] => "9:00am" [2] => "7:00pm" ) [1] => Array ( [0] => "Tue 1st July" [1] => "9:00am" [2] => "7:00pm" ) ...
Нет проблем с массивом, поскольку я распечатал его. Вот цикл foreach (это вложенный foreach ($ week as $ day), где возникает ошибка):
foreach($dates as $week) { if($i == 2) { $html .= '<table cellpadding="5" cellspacing="2" border="0" class="kc_ot_openingTable last">'; } else { $html .= '<table cellpadding="5" cellspacing="2" border="0" class="kc_ot_openingTable">'; } $html.= '<tr class="kc_ot_weekCommence"> <td colspan="3">Week Commencing '.$week[0][0].'</td> </tr> <tr class="kc_ot_openingTableTitle"> <td class="day">Day</td> <td class="open">Open</td> <td class="closed">Closed</td> </tr>'; foreach($week as $day) { $html .= '<tr> <td>'.$day[0].'</td> <td class="open">'.$day[1].'</td> <td class="closed">'.$day[2].'</td> </tr> <tr>'; } $html .= '</table>'; ++$i; }
Может ли кто-нибудь определить, что происходит?
редактировать
Я выяснил, что $ date – это хорошо, проблема возникает, когда цикл foreach ($ date как $ week) работает на прошлой неделе.
Re Редактировать
Вот функция, из которой это происходит. Пожалуйста, не судите, я унаследовал этот сайт: P
function getOpeningHours() { date_default_timezone_set('Europe/London'); $dates = array( array( array( date("D jS F", strtotime("monday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("tuesday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("wednesday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("thursday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("friday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("saturday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("sunday this week")), "9:00am", "7:00pm" ), ), array( array( date("D jS F", strtotime("monday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("tuesday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("wednesday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("thursday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("friday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("saturday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("sunday next week")), "9:00am", "7:00pm" ), ), array( array( date("D jS F", strtotime("monday next week", strtotime("monday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("tuesday next week", strtotime("tuesday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("wednesday next week", strtotime("wednesday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("thursday next week", strtotime("thursday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("friday next week", strtotime("friday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("saturday next week", strtotime("saturday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("sunday this week", strtotime("sunday next week"))), "9:00am", "7:00pm" ) ), ); $sql[0] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Ymd", strtotime("monday this week"))."' AND `exception_date` <= '".date("Ymd", strtotime("sunday this week"))."'"; $sql[1] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Ymd", strtotime("monday next week"))."' AND `exception_date` <= '".date("Ymd", strtotime("sunday next week"))."'"; $sql[2] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Ymd", strtotime("monday next week", strtotime("monday next week")))."' AND `exception_date` <= '".date("Ymd", strtotime("sunday next week", strtotime("sunday next week")))."'"; $i=0; foreach($sql as $string) { $result = mysql_query($string) or die(mysql_error()); $r = mysql_fetch_array($result); foreach($dates[$i] as &$week) { if($week[0] == date("D jS F", strtotime($r["exception_date"]))) { $week[1] = date("g:ia", strtotime($r["exception_opening"])); $week[2] = date("g:ia", strtotime($r["exception_closing"])); } } ++$i; } $html = ""; $i = 0; //print_r($dates); foreach($dates as $week) { print_r($week); if($i == 2) { $html .= '<table cellpadding="5" cellspacing="2" border="0" class="kc_ot_openingTable last">'; } else { $html .= '<table cellpadding="5" cellspacing="2" border="0" class="kc_ot_openingTable">'; } $html.= '<tr class="kc_ot_weekCommence"> <td colspan="3">Week Commencing '.$week[0][0].'</td> </tr> <tr class="kc_ot_openingTableTitle"> <td class="day">Day</td> <td class="open">Open</td> <td class="closed">Closed</td> </tr>'; foreach($week as $day) { $html .= '<tr> <td>'.$day[0].'</td> <td class="open">'.$day[1].'</td> <td class="closed">'.$day[2].'</td> </tr>'; } $html .= '</table>'; ++$i; } return $html; }
вfunction getOpeningHours() { date_default_timezone_set('Europe/London'); $dates = array( array( array( date("D jS F", strtotime("monday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("tuesday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("wednesday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("thursday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("friday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("saturday this week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("sunday this week")), "9:00am", "7:00pm" ), ), array( array( date("D jS F", strtotime("monday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("tuesday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("wednesday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("thursday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("friday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("saturday next week")), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("sunday next week")), "9:00am", "7:00pm" ), ), array( array( date("D jS F", strtotime("monday next week", strtotime("monday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("tuesday next week", strtotime("tuesday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("wednesday next week", strtotime("wednesday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("thursday next week", strtotime("thursday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("friday next week", strtotime("friday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("saturday next week", strtotime("saturday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("sunday this week", strtotime("sunday next week"))), "9:00am", "7:00pm" ) ), ); $sql[0] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Ymd", strtotime("monday this week"))."' AND `exception_date` <= '".date("Ymd", strtotime("sunday this week"))."'"; $sql[1] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Ymd", strtotime("monday next week"))."' AND `exception_date` <= '".date("Ymd", strtotime("sunday next week"))."'"; $sql[2] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Ymd", strtotime("monday next week", strtotime("monday next week")))."' AND `exception_date` <= '".date("Ymd", strtotime("sunday next week", strtotime("sunday next week")))."'"; $i=0; foreach($sql as $string) { $result = mysql_query($string) or die(mysql_error()); $r = mysql_fetch_array($result); foreach($dates[$i] as &$week) { if($week[0] == date("D jS F", strtotime($r["exception_date"]))) { $week[1] = date("g:ia", strtotime($r["exception_opening"])); $week[2] = date("g:ia", strtotime($r["exception_closing"])); } } ++$i; } $html = ""; $i = 0; //print_r($dates); foreach($dates as $week) { print_r($week); if($i == 2) { $html .= '<table cellpadding="5" cellspacing="2" border="0" class="kc_ot_openingTable last">'; } else { $html .= '<table cellpadding="5" cellspacing="2" border="0" class="kc_ot_openingTable">'; } $html.= '<tr class="kc_ot_weekCommence"> <td colspan="3">Week Commencing '.$week[0][0].'</td> </tr> <tr class="kc_ot_openingTableTitle"> <td class="day">Day</td> <td class="open">Open</td> <td class="closed">Closed</td> </tr>'; foreach($week as $day) { $html .= '<tr> <td>'.$day[0].'</td> <td class="open">'.$day[1].'</td> <td class="closed">'.$day[2].'</td> </tr>'; } $html .= '</table>'; ++$i; } return $html; }
TL; DR – Ссылки злые!
Проблема здесь:
foreach ($dates[$i] as &$week) { // updates based on database values } foreach ($dates as $week) { // generate html from week data }
После завершения первого цикла последняя неделя по-прежнему является ссылкой, а также $dates[count($dates) - 1]
. Во втором цикле $week
получает по очереди каждый элемент из $dates
.
Когда дело доходит до последнего элемента, $week
присваивается самому себе и, следовательно, создается рекурсивная структура.
Исправление прост:
foreach ($dates[$i] as &$week) { // updates based on database values } unset($week); // remove the reference
В качестве альтернативы:
foreach ($dates[$i] as $week) { // updates based on database values if (<some condition>) { $dates[$i][1] = 'foo'; $dates[$i][2] = 'bar'; } }
Хорошо,
$weeks = array( array( array("Mon 23rd June", "9:00 AM", "7:00 PM"), array("Tue 24th June", "9:00 AM", "7:00 PM"), array("Wed 25th June", "9:00 AM", "7:00 PM") //etc ), array() // another week ) $dates = array($weeks)
Поэтому, если ваша цель – просто распечатать «Пн 23 июня», попробуйте
print_r(day[0][0]);
Кроме того, в следующий раз упомянем, как вы объявляете массив, и это становится намного проще. Я думаю, ваш массив $ weeks должен быть назван $ week из его взглядов. Кроме того, </ tr> <tr> кажется непреднамеренным
edit: Я нашел ошибку
array( date("D jS F", strtotime("monday next week", strtotime("monday next week"))), "9:00am", "7:00pm" ),
Сделайте что-нибудь наподобие даты («D jS F», strtotime («понедельник на следующей неделе + 7 дней»). Это будет в понедельник на следующей неделе +7 дня, ака через понедельник через две недели. Не думаю, что «понедельник на следующей неделе ", strtotime (" понедельник на следующей неделе ")" является синтаксисом. Такая же ошибка может быть здесь:
$sql[2] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Ymd", strtotime("monday next week", strtotime("monday next week")))."' AND `exception_date` <= '".date("Ymd", strtotime("sunday next week", strtotime("sunday next week")))."'";
Просто предложение о том, чтобы даты были сгенерированы лучше, но для вашего магазина или что-то еще, этот способ может быть самым убедительным. Создайте массив / коллекцию / список (Date, Value) в PHP. Используйте это, чтобы создать свой массив, и если вам нужно разделить его на несколько недель, используйте array_chunk [$ dates, 7]
Re Редактировать:
Посмотрите на самый конец этого массива дат
array( date("D jS F", strtotime("saturday next week", strtotime("saturday next week"))), "9:00am", "7:00pm" ), array( date("D jS F", strtotime("**sunday *this* week**", strtotime("sunday next week"))), "9:00am", "7:00pm" )
Измените это на следующую неделю + 7 дней, и я думаю, что это может принести пользу.