2012-09-11 80 views
0

在这里我从数据库表的行中访问'日期'键值。我可以回应这些价值观,没问题。循环数组值

$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 dates-“2012年9月25日”,“2012-09-27”和“2012年9月29日”。 但是之后我需要将这些'日期'值中的每一个值与$date->format('Y-m-d')的值从下面的代码中进行比较,并将每个日期以相应的“繁忙”或“可用”状态显示在表格的单独<td>中。我的下一个版本只比较'date'键的“最后”值 - “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年9月25日” <td>和2012年的“<td> -09-27“,因为这些也是$ row数组中存在的'date'值。不幸的是,我不能在这里发布任何图片来显示,但我希望我的结果能够让您明白。

解决与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

虽然你的问题不明确,但AFAIK 如果可用日期发生在给定日期之间,并且您想要检查长达3周,您想要显示“忙碌”。我对吗? – diEcho

+2

在SQL中进行日期检查会不会更容易? – andrewsi

+0

@raivis:尝试使用MySQL解决方案。 – diEcho

回答

-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>'; 
     } 
} 
+1

严格比较('===')会有什么区别? – diEcho

+0

nop。此版本再次检查'日期'键的“最后”值 – raivis

+0

@diEcho'==='没有区别,因为所有这些值都是相同的数据类型也 – raivis

0

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

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

相反,您应该使用the DateTime class的功能来比较对象本身。如果您需要使用format()方法的唯一时间是输出到浏览器的时候,到一个SQL查询等

+0

我从DB获取的'date'值存储为('Y-m-d'),这就是为什么我将$ date转换为此格式 – raivis

+0

您应该转换另一种方式:将字符串转换为对象,而不是将对象转换为字符串。 – IMSoP

0

虽然你的问题不清楚,但据我所知

要显示“忙”如果发生可用日期给定日期高达3周的 否则显示为“无”

我想建议你使用MySQL(未测试)

SELECT *, 
IF(`DateCol` BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 3 WEEK), 'Busy','Free') 
AS status 
FROM TableName 
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"); 
} 
+0

而不是只发布已更正的代码,您是否可以添加注释来解释您已更改的内容? – IMSoP

+0

再次。这里只有最后的'日期'值。 – raivis

+0

@raivis刚刚更新了一个新的解决方案。也dded一些解释性文字 –

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>"; 
} 
?> 

除了打印的价值观,我想将它们添加到数组,然后运行该阵列上的循环,值比较给定的开始和结束日期。如果你很少需要日期,我也不会从表格中提取所有内容。