Последний элемент в цикле foreach – это массив, который он перемещает

У меня есть целый ряд недель, недель и недель после даты, даты открытия и закрытия. По какой-то причине, когда цикл 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 дней, и я думаю, что это может принести пользу.