2017-11-06 15 views
1

私はイベントのカレンダーを持っており、データベースから取り出されたイベントをアコートしています。しかし、真夜中のアイテムは技術的にプログラム的に早いので、最初にリストに表示されます。真夜中以降のアイテムがリストの最後に表示されるようにソートするにはどうすればよいですか?深夜12時以降のアイテムでPHPを使用する時間がありません

usort($events, function($a, $b) { 
    //if after midnight (before 8am of next day) 
    return strtotime($a['start_time']) >= strtotime('8:00') ? strtotime($a['start_time']) - strtotime($b['start_time']) : 1; 
}); 

私は今それを持っている方法は、彼らが正しい順序でソートしているが、深夜以降の項目はちょうど最初の項目の後に現れています。私が通常これを「8am条件の前に」なくして並べ替えると、最初に表示されます。

+1

日付と時刻を一緒に保存すると、正しく並べ替えられます。また、dbクエリでこれを並べ替えることもできます。おそらくより速くなります。 – nogad

+0

@nogad毎日特定の時刻に繰り返されるイベントを考えてみましょう。 – Barmar

+0

@nogadセットアップのため、これはユーザーがこれらのイベントを作成するのに意味がありません。これらのイベントは、3日間の会議のイベントです。我々は、ユーザが一連のイベントのために同じ日付を入力する必要はない。私は曜日のラジオセレクタとその時間のタイムセレクタを持っています。 – pinksharpii

答えて

1

時間が早朝の場合は、夕方の時間の後になるように1日を追加します。

usort($events, function($a, $b) { 
    $oneday = 86400; // seconds in a day 
    $cutoff = strtotime('8:00'); 
    $atime = strtotime($a['start_time']); 
    if ($atime < $cutoff) { 
     $atime += $oneday; 
    } 
    $btime = strtotime($b['start_time']); 
    if ($btime < $cutoff) { 
     $btime += $oneday; 
    } 
    return $atime - $btime; 
}); 
+0

これは完全に意味があります。私はこれをするとは思わなかったでしょう。ありがとうございました。 – pinksharpii

関連する問題