0

在这里,我从 DB 表的行中访问“日期”键值。我可以回显这些值,没问题。

$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>的表格中。我的以下版本仅比较“日期”键的“最后一个”值 - “2012-09-29”,但我需要比较上面数组中的每个“日期”值,这也意味着“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

但事实上,我还需要在<td>“2012-09-25”和<td>“2012-09-27”中显示“忙碌”状态,因为这些也是 $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>';
            }
    }
4

5 回答 5

0

我还没有测试过你的代码,但我认为你在->format('Y-m-d')这里不必要地运行,这搞乱了你的逻辑。

每次运行时,PHP 都会将您的对象转换为字符串,然后您将其与其他字符串进行比较。这不会做任何有用的事情。

相反,您应该使用DateTime特性来比较对象本身。唯一需要使用该format()方法的时候是输出到浏览器、输入 SQL 查询等

于 2012-09-11T18:22:44.760 回答
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>";
}
?>

我不会打印值,而是将它们添加到数组中,然后在该数组上运行一个循环,将值与给定的开始日期和结束日期进行比较。如果您只需要一个日期,我也不会从表中获取所有内容。

于 2012-09-11T19:02:06.690 回答
0

虽然你的问题不清楚,但 AFAIK

如果可用日期发生在给定日期最多 3 周之间,您想显示“忙碌”,否则显示“空闲”

我想建议你用 MySQL 做这个(未测试)

SELECT *,
IF( `DateCol` BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 3 WEEK), 'Busy','Free') 
AS status
FROM TableName
于 2012-09-11T18:27:06.200 回答
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");
}
于 2012-09-11T18:27:59.373 回答
-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>';
        }
}
于 2012-09-11T18:16:56.147 回答