Sort multidimensional array by multiple keys

前端 未结 7 696
挽巷
挽巷 2020-11-22 10:05

I\'m trying to sort a multidimensional array by multiple keys, and I have no idea where to start. I looked at uasort, but wasn\'t quite sure how to write a function for what

7条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 10:30

    PHP7 Makes sorting by multiple columns SUPER easy with the spaceship operator (<=>) aka the "Combined Comparison Operator" or "Three-way Comparison Operator".

    Resource: https://wiki.php.net/rfc/combined-comparison-operator

    Sorting by multiple columns is as simple as writing balanced/relational arrays on both sides of the operator. Easy done!

    I have not used uasort() because I don't see any need to preserve the original indexes.

    Code: (Demo)

    $array = [
        ['ID' => 1, 'title' => 'Boring Meeting', 'date_start' => '2010-07-30', 'event_type' => 'meeting', 'state' => 'new-york'],
        ['ID' => 2, 'title' => 'Find My Stapler', 'date_start' => '2010-07-22', 'event_type' => 'meeting', 'state' => 'new-york'],
        ['ID' => 3, 'title' => 'Mario Party', 'date_start' => '2010-07-22', 'event_type' => 'party', 'state' => 'new-york'],
        ['ID' => 4, 'title' => 'Duct Tape Party', 'date_start' => '2010-07-28', 'event_type' => 'party', 'state' => 'california']
    ];
    
    usort($array, function($a, $b) {
        return [$a['state'], $a['event_type'], $a['date_start']]
               <=>
               [$b['state'], $b['event_type'], $b['date_start']];
    });
    
    var_export($array);
    

    Output

    array (
      0 => 
      array (
        'ID' => 4,
        'title' => 'Duct Tape Party',
        'date_start' => '2010-07-28',
        'event_type' => 'party',
        'state' => 'california',
      ),
      1 => 
      array (
        'ID' => 2,
        'title' => 'Find My Stapler',
        'date_start' => '2010-07-22',
        'event_type' => 'meeting',
        'state' => 'new-york',
      ),
      2 => 
      array (
        'ID' => 1,
        'title' => 'Boring Meeting',
        'date_start' => '2010-07-30',
        'event_type' => 'meeting',
        'state' => 'new-york',
      ),
      3 => 
      array (
        'ID' => 3,
        'title' => 'Mario Party',
        'date_start' => '2010-07-22',
        'event_type' => 'party',
        'state' => 'new-york',
      ),
    )
    

    p.s. Arrow syntax with PHP7.4 and higher (Demo)...

    usort($array, fn($a, $b) => [$a['state'], $a['event_type'], $a['date_start']] <=> [$b['state'], $b['event_type'], $b['date_start']]);
    

提交回复
热议问题