2017-08-07 3 views
0

イベントの予定表を作成しています。イベントの開始日と終了日は、YYYYMMDDの形式で格納されます。イベントリストは1日に表示され、イベントは1日または複数日にわたることができます。2つの日付とルールで配列を並べ替えます。

イベントは現在start_dateend_date

で、配列に格納されているどのようにすることができます:

  • 移動 配列の先頭に現在の日付に開始されたイベント。
  • そして、その後

終了日でイベントを並べ替える開始日

  • でイベントを並べ替えるには、このquestionを見ましたが、私は上記のロジックを構築する方法を放浪します。

  • +0

    は、次の3つのソートの種類または1つのすべてのこれらのルールをしたいですか? –

    答えて

    2

    現在の日付から開始するイベントを配列の先頭に移動しますが、他のイベントはそのまま並べ替えてください!開始日によって

    $today = date('Ymd',strtotime('today')); 
    usort($events,function($a,$b) use($today){ 
        if($a['start_date'] === $today && $b['start_date'] != $today){return -1;} 
        else if($b['start_date'] === $today && $a['start_date'] != $today){return 1;} 
        else {return strnatcmp($a['start_date'],$b['start_date']);} 
    }); 
    

    またはソートイベント

    usort($events,function($a,$b){ 
        return strnatcmp($a['start_date'],$b['start_date']); 
    }); 
    

    または終了日までイベントソート

    usort($events,function($a,$b){ 
        return strnatcmp($a['end_date'],$b['end_date']); 
    }); 
    

    EDITいくつかのテストデータ:

    //example works best if today is 20170810 
    $events = array(
        array(
        'name' => 'a', 
        'start_date' => '20170810', 
        'end_date' => '20170811', 
    ), 
        array(
        'name' => 'b', 
        'start_date' => '20170810', 
        'end_date' => '20170810', 
    ), 
        array(
        'name' => 'c', 
        'start_date' => '20170607', 
        'end_date' => '20170608', 
    ), 
        array(
        'name' => 'd', 
        'start_date' => '20170607', 
        'end_date' => '20170607', 
    ), 
        array(
        'name' => 'e', 
        'start_date' => '20170810', 
        'end_date' => '20170812', 
    ), 
        array(
        'name' => 'f', 
        'start_date' => '20170807', 
        'end_date' => '20170817', 
    ), 
    ); 
    print_r($events); 
    

    EDIT:それらのすべてを一緒に:進行中のイベントがあります「で注文されていますイベントは '?彼らは今日始めている'、 'START_DATE'、 'END_DATE'

    $today = date('Ymd',strtotime('today')); 
    usort($events,function($a,$b) use($today){ 
        //one of them starts today 
        if($a['start_date'] === $today && $b['start_date'] != $today){return -1;} 
        else if($b['start_date'] === $today && $a['start_date'] != $today){return 1;} 
        //both or neither start today, compare start_date 
        else { 
        if($a['start_date'] != $b['start_date']){ 
         //start_dates differ, order by them 
         return strnatcmp($a['start_date'],$b['start_date']); 
        } else { 
         //start dates are the same, order by end_date 
         return strnatcmp($a['end_date'],$b['end_date']); 
        } 
        } 
    }); 
    
    print_r($events); 
    

    EDITを順に並んでい彼らは現在、進行中 ' 'START_DATE'、 'END_DATE'

    $today = date('Ymd',strtotime('today')); 
    //function compares two elements to decide their position relative to each other 
    usort($events,function($a,$b) use($today){ 
        //check if event is currently ongoing 
        //starts or ends today or today is between start and end 
        $ongoing = function($event) use($today){ 
        //this is the simplest form I could think of for the check 
        return (strnatcmp($event['start_date'],$today) < 1 && strnatcmp($today,$event['end_date']) < 1); 
        }; 
        $startstoday = function($event) use($today){ 
        return $event['start_date'] === $today; 
        }; 
        //only one of them is ongoing 
        if($ongoing($a) && !$ongoing($b)){return -1;} 
        else if($ongoing($b) && !$ongoing($a)){return 1;} 
        //both or neither are ongoing, compare start_date 
        else { 
        if($a['start_date'] != $b['start_date']){ 
         //start_dates differ, order by them 
         return strnatcmp($a['start_date'],$b['start_date']); 
        } else { 
         //start dates are the same, order by end_date 
         return strnatcmp($a['end_date'],$b['end_date']); 
        } 
        } 
    }); 
    
    print_r($events); 
    

    EDIT:今日から、継続的なイベントが順に並んでい '?彼らは今日始めている'、' いますか? ?彼らは現在、進行中」、 'START_DATE'、 'END_DATE'

    $today = date('Ymd',strtotime('today')); 
    //function compares two elements to decide their position relative to each other 
    usort($events,function($a,$b) use($today){ 
        //check if event is currently ongoing 
        //starts or ends today or today is between start and end 
        $ongoing = function($event) use($today){ 
        //this is the simplest form I could think of for the check 
        return (strnatcmp($event['start_date'],$today) < 1 && strnatcmp($today,$event['end_date']) < 1); 
        }; 
        //only one of them is ongoing 
        if($ongoing($a) && !$ongoing($b)){return -1;} 
        else if($ongoing($b) && !$ongoing($a)){return 1;} 
        //both are ongoing 
        else if($ongoing($a) && $ongoing($b)){ 
        //one starts today 
        if($a['start_date'] === $today && $b['start_date'] != $today){return -1;} 
        else if($b['start_date'] === $today && $a['start_date'] != $today){return 1;} 
        //both start today 
        else if($a['start_date'] === $today && $b['start_date'] === $today){ 
         return strnatcmp($a['end_date'],$b['end_date']); 
        } 
        //none starts today 
        else { 
         if($a['start_date'] != $b['start_date']){ 
         //start_dates differ, order by them 
         return strnatcmp($a['start_date'],$b['start_date']); 
         } else { 
         //start dates are the same, order by end_date 
         return strnatcmp($a['end_date'],$b['end_date']); 
         } 
        } 
        } else { 
        //neither are ongoing, compare start_date 
        if($a['start_date'] != $b['start_date']){ 
         //start_dates differ, order by them 
         return strnatcmp($a['start_date'],$b['start_date']); 
        } else { 
         //start dates are the same, order by end_date 
         return strnatcmp($a['end_date'],$b['end_date']); 
        } 
        } 
    }); 
    
    print_r($events); 
    

    と、この最後のONEを簡略化することができるTO:

    $today = date('Ymd',strtotime('today')); 
    usort($events,function($a,$b) use($today){ 
        $ongoing = function($event) use($today){ 
        return (strnatcmp($event['start_date'],$today) < 1 && strnatcmp($today,$event['end_date']) < 1); 
        }; 
        if($ongoing($a)){ 
        if(!$ongoing($b)){return -1;} 
        else { 
         if($a['start_date'] === $today && $b['start_date'] != $today){return -1;} 
         else if($b['start_date'] === $today && $a['start_date'] != $today){return 1;} 
        } 
        } else if($ongoing($b)){return 1;} 
        if($a['start_date'] != $b['start_date']){ 
        return strnatcmp($a['start_date'],$b['start_date']); 
        } else { 
        return strnatcmp($a['end_date'],$b['end_date']); 
        } 
    }); 
    
    print_r($events); 
    
    +0

    感謝のピーターは、意味をなさない - ちょうどお互いの後に各種類を適用するとは思わなかった。 – addedlovely

    +1

    @addedlovely各ソートは以前のものを元に戻すことに注意してください。 3つのルールが降順で適用されているソータを1つだけ希望しましたか? –

    +1

    @addedlovely私はすべてのルールを組み合わせ、現在進行中のイベントを考慮したソリューションを追加しました。 –

    関連する問題