【问题标题】:Sorting nested Array PHP排序嵌套数组 PHP
【发布时间】:2017-05-07 08:50:07
【问题描述】:

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

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) array_push 不返回数组。只要array_push($group, $team_werte); 做你想做的事
  • 2) 使用 usrort - php.net/manual/en/function.usort.php 或 array_multisort - php.net/manual/en/function.array-multisort.php 对结果数组进行排序。当您编写代码并收到任何问题时返回您的问题
  • 感谢 splash58,我得到了带有您的评论 1 的多数组,并将尝试排序并返回 ;-)
  • 你看到我的编辑了吗?我可以问你很好,如果你能再次帮助我吗?
  • eval.in 上创建测试数组并显示链接

标签: php arrays sorting


【解决方案1】:

您可以通过多种方式使用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() 带有 spaceship 运算符,依赖于输入数组列结构:

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

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多