这里我从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”和“2012-09-29”。
但是,我需要将这些“日期”值中的每一个与下面代码中的$date->format('Y-m-d')
值进行比较,并将具有相应“忙”或“可用”状态的每个日期显示在表格的单独<td>
中。我的以下版本仅比较'date'键的“last”值 - “2012-09-29”,但我需要比较上面数组中的每个'date'值,它也意味着“2012-09-25”和“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>';
}
}
答案 0 :(得分:0)
我没有测试过您的代码,但我认为您在此处不必要地运行->format('Y-m-d')
,这会弄乱您的逻辑。
每次运行时,PHP都会将您的对象转换为字符串,然后将其与其他字符串进行比较。这不会有用。
相反,您应该使用the DateTime
class的功能来比较对象本身。您应该使用format()
方法的唯一时间是输出到浏览器,SQL查询等等
答案 1 :(得分:0)
虽然你的问题不清楚,但AFAIK
如果在给定日期最多3周之间出现可用日期,则您希望显示“忙碌” 否则显示“免费”
我建议您使用MySQL(未测试)
进行此操作SELECT *,
IF( `DateCol` BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 3 WEEK), 'Busy','Free')
AS status
FROM TableName
答案 2 :(得分:0)
尝试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");
}
答案 3 :(得分:0)
这样的东西? (如果我理解你正在努力做的事情)
<?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>";
}
?>
我会将它们添加到数组中,而不是打印值,然后在该数组上运行循环,将值与给定的开始和结束日期进行比较。如果您需要约会,我也不会从表中获取所有内容。
答案 4 :(得分:-1)
可能是这样的吗?
$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>';
}
}