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 からのすべての「日付」値を示しています。この場合、「2012-09-25」、「2012-09-27」、「2012-09-29」の 3 つの日付があります。しかし、これらの「日付」値のそれぞれを$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" と "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>';
            }
    }
4

5 に答える 5

0

あなたの質問は不明確ですが、よくあるですが

利用可能な日付が指定された日付から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 に答える
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

私はあなたのコードをテストしていませんが、あなたはここで不必要に実行していると思います->format('Y-m-d').これはあなたのロジックを台無しにしています.

これを実行するたびに、PHP はオブジェクトを文字列に変換し、それを他の文字列と比較します。これでは何の役にも立ちません。

代わりにDateTimeクラスの機能を使用してオブジェクト自体を比較する必要があります。このメソッドを使用する必要があるのformat()は、ブラウザや SQL クエリなどに出力するときだけです。

于 2012-09-11T18:22:44.760 に答える
-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 に答える