在这里,我从DB表的行中访问'date'键值。我可以呼应这些价值观,没问题。
$res = $mysqli->query("SELECT * FROM alfred ORDER BY id ASC");
$row = $res->fetch_all(MYSQLI_ASSOC);
foreach ($row as $key => $value){
$availDate = $value['date'];
echo $availDate.'<br />';
}
上面的这个循环显示了DB中的所有"日期"值,在这种情况下有3个日期-"2012-09-25"、"2012-09-27"answers"2012-09-29"。但是,我需要将这些"日期"值中的每一个与下面代码中的$date->format('Y-m-d')
值进行比较,并将每个具有相应"忙"或"可用"状态的日期显示在表的单独<td>
中。我下面的版本只比较"日期"键的"最后"值-"2012-09-29",但我需要比较上面数组中的每个"日期"值,它也意味着"2012-09-25"answers"2012-09-27"。我试过很多版本,但仍然没有成功。有什么想法吗?
$date = new DateTime();
$endDate = new DateTime('+10 day');
for($date->format('Y-m-d'); $date->format('Y-m-d') < $endDate->format('Y-m-d'); $date->modify('+1 day')){
if ($date->format('Y-m-d') == $availDate){
echo '<td>'.$date->format('Y-m-d/D').' busy</td>';
} else {
echo '<td>'.$date->format('Y-m-d/D').' available</td>';
}
}
这是我现在得到的结果:
2012-09-21/Fri available 2012-09-22/Sat available 2012-09-23/Sun available 2012-09-24/Mon available 2012-09-25/Tue available 2012-09-26/Wed available 2012-09-27/Thu available 2012-09-28/Fri available 2012-09-29/Sat busy 2012-09-30/Sun available
但事实上,我还需要在"2012-09-25"的<td>
和"2012-09-27"的<td>
中显示"忙碌"状态,因为这些也是$row数组中存在的"日期"值。不幸的是,我不能在这里发布任何图片来展示,但我希望我上面的结果能给你这个想法。
在以下in_array的帮助下解决:
$aAvailDate = array();
foreach ($row as $key => $value){
$aAvailDate[] = $value['date'];
}
$date = new DateTime();
$endDate = new DateTime('+10 day');
for($date->format('Y-m-d'); $date->format('Y-m-d') < $endDate->format('Y-m-d'); $date->modify('+1 day')){
if (in_array($date->format('Y-m-d'), $aAvailDate)){
echo '<td>'.$date->format('Y-m-d/D').' busy</td>';
} else {
echo '<td>'.$date->format('Y-m-d/D').' available</td>';
}
}
我还没有测试您的代码,但我认为您在这里不必要地运行->format('Y-m-d')
,这会打乱您的逻辑。
每次运行它时,PHP都会将对象转换为字符串,然后将其与其他字符串进行比较。这不会有任何用处。
相反,您应该使用DateTime
类的功能来比较对象本身。唯一需要使用format()
方法的时间是输出到浏览器、SQL查询等
尽管您的问题不清楚,但AFAIK
如果可用日期出现在给定日期到3周之间,您希望显示"忙"否则显示"免费"
我想建议你用MySQL(未测试)来做这件事
SELECT *,
IF( `DateCol` BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 3 WEEK), 'Busy','Free')
AS status
FROM TableName
尝试while
循环而不是foreach
。此外,直接比较DateTime对象,而不是格式化的字符串。
$date = new DateTime();
$endDate = new DateTime('+3 week');
while( $date < $endDate) {
if ($date->format('Y-m-d') == $availDate){
echo '<td class="busy">busy</td>';
} else {
echo '<td>free</td>';
}
$date->modify("+1 day");
}
类似的东西?(如果我理解你想正确地做什么)
<?php
$avail_dates = array();
$res = $mysqli->query("SELECT DATE_FORMAT(date, '%Y-%m-%d') AS availDate FROM alfred ORDER BY id ASC");
$row = $res->fetch_all(MYSQLI_ASSOC);
foreach ($row as $key => $value){
$avail_dates[] = $value['availDate'];
}
$startDate = date('Y-m-d');
$endDate = date('Y-m-d', strtotime(date("Y-m-d", strtotime($startDate)) . " +3 week"));
?>
<table>
<?php
foreach ($avail_dates as $availDate){
echo "<tr><td>$availDate</td>";
if (($startDate <= $availDate) && ($endDate >= $availDate)){
echo "<td class='busy'>busy</td>";
}else{
echo "<td>free</td>";
}
echo "</tr>";
}
?>
我不打印值,而是将它们添加到数组中,然后在该数组上运行一个循环,将值与给定的开始和结束日期进行比较。如果你只需要约会,我也不会把所有的东西都拿出来。
可能是这样的吗?
$date = new DateTime();
$endDate = new DateTime('+3 week');
for($date->format('Y-m-d'); $date->format('Y-m-d') < $endDate->format('Y-m-d'); $date->modify('+1 day')){
$tempDate = $date->format('Y-m-d');
if ($tempDate === $availDate){
echo '<td class="busy">busy</td>';
} else {
echo '<td>free</td>';
}
}