循环数组值

时间:2012-09-11 18:13:38

标签: php arrays loops

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

5 个答案:

答案 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>';
        }
}