对嵌套数组PHP进行排序

时间:2017-05-07 08:50:08

标签: php arrays sorting

我的问题是关于运动表。我正在使用不同的数据库请求为每个团队构建一个数组。这看起来像:

Array(
    [team_id] => 1
    [punkte] => 9
    [fairness] => 5
    [tore_diff] => 3
    [tore_erzielt] => 6
)

现在每组有4个或6个这样的阵列。我的想法是把它放在一个嵌套数组中:

然后我有一个这样的数组:

Array
(
    [0] => Array
        (
            [team_id] => 1
            [punkte_s] => 6
            [fairness] => 5
            [tore_diff] => -1
            [tore_erzielt] => 6
        )

    [1] => Array
        (
            [team_id] => 2
            [punkte_s] => 1
            [fairness] => 3
            [tore_diff] => -5
            [tore_erzielt] => 2
        )

    [2] => Array
        (
            [team_id] => 3
            [punkte_s] => 9
            [fairness] => 
            [tore_diff] => 12
            [tore_erzielt] => 15
        )

    [3] => Array
        (
            [team_id] => 4
            [punkte_s] => 1
            [fairness] => 
            [tore_diff] => -6
            [tore_erzielt] => 1
        )

)

依此类推我尝试按照这样排序:

foreach ($group as $key => $row) {
    $team_id[$key]      =   $row['team_id'];
    $punkte_s[$key]     =   $row['punkte'];
    $fairness[$key]     =   $row['fairness'];
    $tore_diff[$key]    =   $row['tore_diff'];
    $tore_erzielt[$key] =   $row['tore_erzielt'];

};

array_multisort($punkte_s, SORT_DESC, $fairness, SORT_DESC, $tore_diff, SORT_DESC, $tore_erzielt, SORT_DESC, $group);   

但它没有改变。我的错在哪里?

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式使用usort()array_multisort()。我会示范一些。我喜欢第4种技巧的简洁性,但是它要求您的输入结构始终反映您希望排序的列顺序。

使用usort()对DESC进行排序时,在左侧写上$b值,在右侧写上$a值。

代码:(Demo

    $array1 = $array2 = $array3 = $array4 = [
        ['team_id' => 1, 'punkte_s' => 6, 'fairness' => 5, 'tore_diff' => -1, 'tore_erzielt' => 6],
        ['team_id' => 2, 'punkte_s' => 1, 'fairness' => 3, 'tore_diff' => -5, 'tore_erzielt' => 2],
        ['team_id' => 3, 'punkte_s' => 9, 'fairness' => null, 'tore_diff' => 12, 'tore_erzielt' => 15],
        ['team_id' => 4, 'punkte_s' => 1, 'fairness' => null, 'tore_diff' => -6, 'tore_erzielt' => 1]
    ];
  • array_multisort(),其中有array_column()个呼叫:

    array_multisort(
        array_column($array1, 'punkte_s'), SORT_DESC,
        array_column($array1, 'fairness'), SORT_DESC,
        array_column($array1, 'tore_diff'), SORT_DESC,
        array_column($array1, 'tore_erzielt'), SORT_DESC,
        $array1
    );
    
    var_export($array1);
    
  • array_multisort(),带有foreach循环:

    foreach ($array2 as $row) {
        $punkte_s[] = $row['punkte_s'];
        $fairness[] = $row['fairness'];
        $tore_diff[] = $row['tore_diff'];
        $tore_erzielt[] = $row['tore_erzielt'];
    }
    
    array_multisort(
        $punkte_s, SORT_DESC,
        $fairness, SORT_DESC,
        $tore_diff, SORT_DESC,
        $tore_erzielt, SORT_DESC,
        $array2
    );
    
    var_export($array2);
    
  • usort(),带有飞船运算符和明确的规则数组:

    usort($array3, function($a, $b) {
        return [$b['punkte_s'], $b['fairness'], $b['tore_diff'], $b['tore_erzielt']]
               <=>
               [$a['punkte_s'], $a['fairness'], $a['tore_diff'], $a['tore_erzielt']];
    });
    
    var_export($array3);
    
  • usort()和飞船运算符,依赖于输入数组列结构:

    usort($array4, function($a, $b) {
        unset($a['team_id'], $b['team_id']);
        return $b <=> $a;
    });
    
    var_export($array4);