我有一个星期,下周和一周的日期,包括日期,开放时间和结束时间。出于某种原因,当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)循环在上周运行时会出现问题。
重新编辑
这是来自的功能。请不要判断,我继承了这个网站: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("Y-m-d", strtotime("monday this week"))."' AND `exception_date` <= '".date("Y-m-d", strtotime("sunday this week"))."'";
$sql[1] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Y-m-d", strtotime("monday next week"))."' AND `exception_date` <= '".date("Y-m-d", strtotime("sunday next week"))."'";
$sql[2] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Y-m-d", strtotime("monday next week", strtotime("monday next week")))."' AND `exception_date` <= '".date("Y-m-d", 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;
}
答案 0 :(得分:1)
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';
}
}
答案 1 :(得分:0)
好的,
$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)
因此,如果你的目标只是打印&#34; 6月23日星期一&#34;,请尝试
print_r(day[0][0]);
另外,下次提到你如何声明数组,这变得容易多了。我认为你的$ weeks数组应该从它的外观称为$ week。还&lt; / tr&gt; &LT; tr>似乎是无心的
编辑:我发现了错误
array(
date("D jS F", strtotime("monday next week", strtotime("monday next week"))),
"9:00am",
"7:00pm"
),
做类似日期的事情(&#34; D jS F&#34 ;, strtotime(&#34;下周一周一+ 7天&#34;)。这将在下周一周五+7天,也就是星期一两周从现在开始。我不会想到&#34;&#34;&nbsp;&#34;&#34;&nbsp;&#34;&#34;&#34;&#34;,strtotime(&#34;星期一,星期一&#34;)&#34;是有效的语法。同样的错误可能在这里:
$sql[2] = "SELECT * FROM `tbl_opening_exceptions` WHERE `exception_date` >= '".date("Y-m-d", strtotime("monday next week", strtotime("monday next week")))."' AND `exception_date` <= '".date("Y-m-d", strtotime("sunday next week", strtotime("sunday next week")))."'";
只是建议更好地生成日期,但对于您的商店或其他任何方式可能是最方便的。 Create an array/collection/list of (Date,Value) in PHP使用此功能创建数组,如果必须将其拆分为数周,请使用array_chunk [$ dates,7]
重新编辑:
查看该日期数组的最后部分
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天,我认为它可能会有所帮助。