2012-09-11 77 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>"; 
} 
?> 

除了打印的價值觀,我想將它們添加到數組,然後運行該陣列上的循環,值比較給定的開始和結束日期。如果你很少需要日期,我也不會從表格中提取所有內容。