循环数组值


loop array values

在这里,我从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>';
        }
}