2016-12-01 6 views
0

私は予約のためにこのフォームで配列を使用する予約システムがあります。配列を並べ替える、時間によって - PHP

array(6) { 
[0]=> array(5) { 
     ["date"]=> string(10) "08/12/2016" 
     ["start"]=> string(5) "15:00" 
     ["end"]=> string(5) "16:00" 
     ["booked_by"]=> string(5) "mark" 
     ["id"]=> string(1) "4" 
} 

を私は日付で、それをソートすると、中にすべての予約を取得するには、この機能を使用配列:

function getBooking($aula) { 
    global $client; 
    $keys = $client->keys("Calendar:aula$aula:*"); 
    $booking = array(); 

    foreach ($keys as $key => $value) { 
     $result = $client->hGetAll($value); 
     array_push($booking, $result); 
    } 

    usort($booking, function($a1, $a2) { 
     $v1 = strtotime(str_replace("/", "-", $a1['data'])); 
     $v2 = strtotime(str_replace("/", "-", $a2['data'])); 
     return $v1 - $v2; // $v2 - $v1 to reverse direction 
    }); 

    return $booking; 
} 

カレンダーに表示する「開始」キーでも並べ替える必要があります。私は別のusortを追加しようとしましたが、うまくいきません。もっと情報が必要な場合は、私に返信してください。 事前にお手数ですが

+3

あなたの予約データはデータベースに由来していますか?もしそうなら、この種のことが起こるほうがはるかに良いでしょう。 –

答えて

2

@パニックには、データベースリクエストの一環としてソートを行うことができます。

datestartの文字列からデータを抽出し、正しい順序で並べ替えて並べ替えると、strcmp()を使用して並べ替えることができます。例えば、

usort($booking, function($a, $b) { 
    // extract year, month and day from date 
    list($a_month, $a_day, $a_year) = explode('/', $a['date']); 
    list($b_month, $b_day, $b_year) = explode('/', $b['date']); 
    // compare the correctly ordered strings 
    return strcmp($a_year.$a_month.$a_day.$a['start'], $b_year.$b_month.$b_day.$b['start']); 
}); 

いくつかの参照は、コードの一部が
http://php.net/manual/en/function.strcmp.phpstrcmp()
list()http://php.net/manual/en/function.list.php

+0

これには多少の問題があります。日付は、年 - 年の形式ではなくm/d/Y形式であるため、異なる年の日付がある場合、文字列と比較すると正しく機能しません。 –

+0

@ Do not Panicありがとうございました!私はソートが正しく機能するように私の答えを更新しました。 – Steve

+0

@ Steveあなたのコードは、配列内の2つの要素でのみ動作します。配列内に3つ以上の要素がある場合は機能しません。 sevavietlのソリューションが動作します。 – Perumal

0

@Steve溶液が大きいで不慣れである場合。しかし、あなたはまた、array_multisortarray_columnを使用することができます。ここでは

array_multisort(
    array_map('strtotime', array_column($booking, 'date')), 
    array_column($booking, 'start'), 
    $booking 
); 

working demoです。

この特定の状況では、最適ではありませんが、たとえばdateの昇順で並べ替えるなど、必要なときにはより適していますが、start降順などがあります。

それにもかかわらず、このような操作はデータベース内で行う方がよい。 @はコメントで言っ慌てない、慌てないとして

EDIT

、日付によるソートがあるためフォーマットの注意が必要です。これを補うためにarray_map'date'strtotimeとすることができます。

+0

私はあなたも日付の書式でキャッチされて参照してください!私はこの方法が好きですが、以前は見たことがありません。 – Steve

+0

@スティーブ、はい、ちょっと難しいです。 – sevavietl