-1

ユーザーが(YYYY-mm-dd)形式で日付を選択し、(H:i)形式で開始時刻と(H:i)形式で終了時刻を選択するユーザー入力フォームがあるか、次の値を持つ3つの変数があると仮定します。

$date      = '2012-11-22';
$startTime = '1:00';
$endTime   = '4:00';

この値を既存の値の配列と比較する必要があります。私の既存の配列は次のようになります。

Array
(
    [0] => Array
        (
            [id] => 1
            [start_datetime] => 2012-11-22 02:30:00
            [end_datetime] => 2012-11-22 05:00:00
        )

    [1] => Array
        (
            [id] => 2
            [start_datetime] => 2012-11-22 00:00:00
            [end_datetime] => 2012-11-22 02:30:00
        )

    [2] => Array
        (
            [id] => 3
            [start_datetime] => 2012-11-22 05:00:00
            [end_datetime] => 2012-11-22 08:00:00
        )

    [3] => Array
        (
            [id] => 4
            [start_datetime] => 2012-11-22 08:00:00
            [end_datetime] => 2012-11-22 11:00:00
        )

    [4] => Array
        (
            [id] => 5
            [start_datetime] => 2012-11-22 11:00:00
            [end_datetime] => 2012-11-22 17:00:00
        )

)

選択した[date、startTime、endTime]のユーザー入力に、指定されたタイムスロットの配列ですでに予約されているスロットがあるかどうかを確認する必要があります。私が見た解決策は、最初に日付を分割して一致させることです。日付と一致する場合は、それに応じて時刻を一致させる必要があります。私はそれをどうやって使うかについて混乱しています。私はあなたたちからいくつかの簡単な解決策を得たいと思っています:)

ありがとうございました。

更新: 私はこの方法を試してみました。

$arenaSurfaceBooking = array(
    array(
        'id' => 1,
        'start_datetime' => '2012-11-22 02:30:00',
        'end_datetime' => '2012-11-22 05:00:00',
    ),
    array(
        'id' => 2,
        'start_datetime' => '2012-11-22 00:00:00',
        'end_datetime' => '2012-11-22 02:30:00',
    ),
    array(
        'id' => 3,
        'start_datetime' => '2012-11-22 05:00:00',
        'end_datetime' => '2012-11-22 08:00:00',
    ),
    array(
        'id' => 4,
        'start_datetime' => '2012-11-22 08:00:00',
        'end_datetime' => '2012-11-22 11:00:00',
    ),
    array(
        'id' => 5,
        'start_datetime' => '2012-11-22 11:00:00',
        'end_datetime' => '2012-11-22 17:00:00',
    )
);

foreach($arenaSurfaceBooking as $booking) {
    $bookedDateTimestamp = strtotime(date('Y-m-d', strtotime($booking['start_datetime'])));
    $inputDateTimestamp  = strtotime($context['date']);
    $bookedStartTime     = strtotime(date('H:i', strtotime($booking['start_datetime'])));
    $bookedEndTime       = strtotime(date('H:i', strtotime($booking['end_datetime'])));
    $userStartTime       = strtotime(date('H:i', strtotime($context['start_datetime'])));
    $userEndTime         = strtotime(date('H:i', strtotime($context['end_datetime'])));
    if( $bookedDateTimestamp == $inputDateTimestamp) {
        if( $userEndTime <= $bookedStartTime || $userStartTime >= $bookedEndTime) {
            echo 'i am booked';
        }
    }
}

動いていない。

4

4 に答える 4

3

ユーザーの日付/時刻が次のようにフォーマットされていると仮定します。

$date      = '2012-11-22';
$startTime = '01:00'; // note the extra '0' in front
$endTime   = '04:00';

$userStartTime = "$date $startTime";
$userEndTime = "$date $endTime";

重複の検索は次のように行われます。

$overlaps = 0;
foreach ($block as $block) {
    if ($userStartTime < $block['end_datetime'] && $userEndTime > $block['start_datetime']) {
        ++$overlaps;
    }
}

// if $overlaps > 0 -> there's a booking in the way

これは基本的に次のような非重複条件を取っています。

$userEndTime <= $block['start_datetime'] || $userStartTime >= $block['end_datetime']

そして、単に条件を交換します。

これはSQLにも簡単に書き込むことができ、データベースとアプリケーション間のネットワークオーバーヘッドを削減します。

于 2012-11-22T12:47:27.260 に答える
1

これをチェックしてください...そして、既存のすべての時間に一致するように要件に応じて変更してください...私はあなたのために1つだけ一致しました...

$date = '2012-11-22';
$startTime = '2:30';
$endTime = '4:00';

$existing[] = 
        array
        (
            'id' => 1,
            'start_datetime' => '2012-11-22 02:30:00',
            'end_datetime' => '2012-11-22 05:00:00'
        );

$UserStartTime = strtotime($date." ".$startTime);
$UserEndTime = strtotime($date." ".$endTime);

$ExistingStartTime = strtotime($existing[0]['start_datetime']);
$ExistingEndTime = strtotime($existing[0]['end_datetime']);

if($UserStartTime >= $ExistingStartTime && $UserEndTime <= $ExistingEndTime)
{
    echo "BOOKED";
}
else
{
    echo "NOT BOOKED";
}
于 2012-11-22T12:34:05.817 に答える
1

既存の配列はSQLクエリからのものであるため、次のようになります。

$date      = '2012-11-22';
$startTime = '1:00'; 
$endTime   = '4:00';

if(strlen($startTime==4)){$startTime="0".$startTime;}
if(strlen($endTime==4)){$endTime="0".$startTime;}

$query="SELECT id FROM table WHERE start_datetime='$date $startTime:00' OR end_datetime='$date $endtimeTime:00'";

クエリが何かを返す場合、返さidれたものは予約されています!

db情報のいずれかが両方の日時に一致するかどうかを知りたい場合は、をに置き換えてORくださいAND

ユーザーの期間がDBのいずれかのエントリの間にあるかどうかを知りたい場合は、次のようにします。

$query="SELECT id FROM table WHERE (start_datetime>='$date $startTime:00' AND start_datetime<='$date $endTime:00') OR (end_datetime<='$date $starttimeTime:00' AND end_datetime>='$date $endtimeTime:00') OR (start_datetime<='$date $startTime:00' AND end_datetime>='$date $starttimeTime:00')";
于 2012-11-22T12:31:06.750 に答える
0

これはあなたを助けるかもしれません

$date = '2012-11-22';
$startTime= '1:00:00'; // padded two zero
$endTime = '4:00:00'; // padded two zero

$start_datetime = $date. " ".(strlen(intval(substr($startTime,0,2))) > 1 ? $startTime : "0".$startTime);

$end_datetime = $date. " ".(strlen(intval(substr($endTime,0,2))) > 1? $endTime : "0".$endTime);
for($i = 0;$i<count($your_array);$i++)
{
    if($your_array[$i]['start_datetime'] == $start_datetime)
    {
        // Start date Found
    }
    if($your_array[$i]['end_datetime'] == $end_datetime)
    {
        // Start end Found
    }
}
于 2012-11-22T12:39:16.047 に答える