【问题标题】:Usort function to sort and groupusort函数进行排序和分组
【发布时间】:2015-09-17 13:05:19
【问题描述】:

我有这个数组。

Array
(
    [0] => Array
        (
            [name] => SUNDERLAND
            [pts] => 2
            [gd] => -4
            [group] => A
        )

    [1] => Array
        (
            [name] => NEWCASTLE
            [pts] => 2
            [gd] => -3
            [group] => C
        )

    [2] => Array
        (
            [name] => STOKE CITY
            [pts] => 2
            [gd] => -2
            [group] => B
        )

    [3] => Array
        (
            [name] => WATFORD
            [pts] => 3
            [gd] => -2
            [group] => A
        )

    [4] => Array
        (
            [name] => TOTTENHAM
            [pts] => 3
            [gd] => -1
            [group] => B
        )

    [5] => Array
        (
            [name] => CHELSEA
            [pts] => 4
            [gd] => -5
            [group] => C
        )

    [6] => Array
        (
            [name] => NORWICH
            [pts] => 4
            [gd] => -3
            [group] => D
        )

    [7] => Array
        (
            [name] => WEST BROM
            [pts] => 4
            [gd] => -4
            [group] => D
        )

)

我必须按照某些标准对这个数组元素进行排序和分组。

在同一组中,第一个 NAME 是具有更大 pts 参数的名称(DESC by pts 参数)。 如果pts参数按gd参数顺序相同(DESC按gd参数)

同组的团队名称放在一起。

Name        pts     gd      group

WATFORD     3       -2      A
SUNDERLAND  2       -4      A
TOTTENHAM   3       -1      B
STOKE CITY  2       -2      B
CHELSEA     4       -5      C
NEWCASTLE   2       -3      C
NORWICH     4       -3      D
WEST BROM   4       -4      D

此时我可以按 pts 和 gd 排序如下:

<?php
function sortByOrder($a, $b){
    $c = $a['pts'] - $b['pts'];
    $c .= $a['gd'] - $b['gd'];
    return $c;
}
usort($all_teams_nf, 'sortByOrder');

foreach($all_teams_nf as $myarr){
    foreach($myarr as $key => $team){
        if($key!="pts" and $key!="gd" and $key!="group"){
            $all_teams[] = $team;
        }
    }
}

$all_teams = array_reverse($all_teams);
?>

请帮助按组组合,然后按 pts 和 gd 在每个组中排序。 (在最终结果中,我需要显示组名和团队名!

A   
    WATFORD 
    SUNDERLAND
B
    TOTTENHAM
    STOKE CITY
C
    CHELSE
    NEWCASTLE
D
    NORWICH
    WEST BROM

【问题讨论】:

    标签: php arrays sorting grouping usort


    【解决方案1】:

    为此,我会使用array_multisort 而不是usort。首先按组键对行进行分组。然后在每个组上使用array_multisort。最后,如果您还需要组按排序顺序显示,您可以使用ksort

    $arraysByGroup = array();
    
    // group by group key
    foreach($array as $element) {
        $arraysByGroup[$element['group']][] = $element;
    }
    
    // sort each group by name, pts, gd
    foreach($arraysByGroup as &$group) {
    
        $name = $pts = $gd = array();
    
        foreach($group as $key => $value) {
            $name[$key] = $value['name'];
            $pts[$key] = $value['pts'];
            $gd[$key] = $value['gd'];
        }
    
        array_multisort($name, SORT_ASC, $pts, SORT_DESC, $gd, SORT_DESC, $group);
    }
    
    ksort($arraysByGroup);
    print_r($arraysByGroup);
    

    【讨论】:

      【解决方案2】:

      我们来看看

      这是我的数组:

      $array = array( array("name" => "SUNDERLAND", "pts" => "2", "gd" => "-4", "group" => "A"), 
                      array("name" => "NEWCASTLE", "pts" => "2", "gd" => "-3", "group" => "C"), 
                      array("name" => "STOKE CITY", "pts" => "2", "gd" => "-2", "group" => "B"), 
                      array("name" => "WATFORD", "pts" => "3", "gd" => "-2", "group" => "A"), 
                      array("name" => "TOTTENHAM", "pts" => "3", "gd" => "-1", "group" => "B"), 
                      array("name" => "CHELSEA", "pts" => "4", "gd" => "-5", "group" => "C"), 
                      array("name" => "NORWICH", "pts" => "4", "gd" => "-3", "group" => "D"),
                      array("name" => "WEST BROM", "pts" => "4", "gd" => "-4", "group" => "D")
      );
      

      这是我的结果:

      Array
      (
          [A] => Array
              (
                  [0] => Array
                      (
                          [name] => SUNDERLAND
                          [pts] => 2
                          [gd] => -4
                          [group] => A
                      )
      
                  [1] => Array
                      (
                          [name] => WATFORD
                          [pts] => 3
                          [gd] => -2
                          [group] => A
                      )
      
              )
      
          [B] => Array
              (
                  [0] => Array
                      (
                          [name] => STOKE CITY
                          [pts] => 2
                          [gd] => -2
                          [group] => B
                      )
      
                  [1] => Array
                      (
                          [name] => TOTTENHAM
                          [pts] => 3
                          [gd] => -1
                          [group] => B
                      )
      
              )
      
          [C] => Array
              (
                  [0] => Array
                      (
                          [name] => CHELSEA
                          [pts] => 4
                          [gd] => -5
                          [group] => C
                      )
      
                  [1] => Array
                      (
                          [name] => NEWCASTLE
                          [pts] => 2
                          [gd] => -3
                          [group] => C
                      )
      
              )
      
          [D] => Array
              (
                  [0] => Array
                      (
                          [name] => NORWICH
                          [pts] => 4
                          [gd] => -3
                          [group] => D
                      )
      
                  [1] => Array
                      (
                          [name] => WEST BROM
                          [pts] => 4
                          [gd] => -4
                          [group] => D
                      )
      
              )
      
      )
      

      在 A 组中,我需要 pts 的 DESC - 有 ASC B组同样的事情 C&D组成绩还可以

      【讨论】:

        【解决方案3】:

        你可能不再需要这个了,但是为了帮助寻找类似东西的人,这就是我解决这个订购问题的方法。

        // data
        $my_array = array(
            array( 'name' => 'SUNDERLAND','pts'=> 2, 'gd' => -4, 'group' => 'A' ),
            array( 'name' => 'NEWCASTLE', 'pts' => 2, 'gd' => -3, 'group' => 'C' ),
            array( 'name' => 'STOKE CITY', 'pts' => 2, 'gd' => -2, 'group' => 'B' ),
            array( 'name' => 'WATFORD', 'pts' => 3, 'gd' => -2, 'group' => 'A' ),
            array( 'name' => 'TOTTENHAM', 'pts' => 3, 'gd' => -1,'group' => 'B'),
            array( 'name' => 'CHELSEA', 'pts' => 4, 'gd' => -5, 'group' => 'C' ),
            array( 'name' => 'NORWICH', 'pts' => 4, 'gd' => -3, 'group' => 'D' ),
            array( 'name' => 'WEST BROM','pts' => 4,'gd' => -4, 'group'=> 'D' )
        );
        
        // sorting by criterias (group; points and gd);
        usort( $my_array, function( $a, $b ) {
            if ( $a['group'] === $b['group'] ) {
              if ( $a['pts'] === $b['pts'] ) {
                  return $a['gd'] < $b['gd']; // order by gd
              }  else {
                return $a['pts'] < $b['pts']; // order by points
              }
            } 
            return $a['group'] > $b['group']; // order by group
        });
        
        // Creating a new array with only desired data.
        $final = [];
        foreach ( $my_array as $team ) {
            if ( empty( $final[ $team['group'] ] ) ) $final[ $team['group'] ] = [];
            array_push( $final[ $team['group'] ], $team['name'] );
        }
        
        print_r( $final );
        

        【讨论】:

          最近更新 更多