【问题标题】:Sort multidimensional array by one value按一个值对多维数组进行排序
【发布时间】:2021-04-02 18:07:58
【问题描述】:

我有一个多维数组,其中包含篮球运动员的数据及其统计数据。我想按统计类别之一对该数组进行排序。如何对数组进行排序?

作为一个小例子,让我们使用以下三个数组,它们是更大数组的一部分:

$playername = array();
$team = array();
$pts = array();

它们被添加到 playerdata 数组中:

$data = array(
     'playername' => $playername,
     'team' => $team,
     'pts' => $pts
);

例如数据数组由三个玩家组成:

  • [0] -> 玩家 A,团队 A,10
  • [1] -> 玩家 B,团队 B,20
  • [2] -> 玩家 C,团队 C,5

我现在想按照$pts数组的内容对数组$data进行排序,最后$data的顺序是:

  • [0] -> 玩家 B,团队 B,20
  • [1] -> 玩家 A,团队 A,10
  • [2] -> 玩家 C,团队 C,5

我怎样才能做到这一点?

编辑:我尝试使用在另一个问题/答案中阅读的解决方案,但无法真正做到我想要的:

usort($array, function($a, $b) {
    return $a['pts'] <=> $b['pts'];
});

【问题讨论】:

  • usort()
  • 我在其他问题/答案中阅读了有关 usort() 的信息,但无法真正让它发挥作用。我使用了其他地方提出的建议。我将代码编辑到我的问题中。
  • 您的数组中不存在order 键,请尝试pts
  • 复制到这里时只是复制粘贴错误。我用pts试了一下,还是不行。值仍然是默认顺序,而不是按“pts”排序,而且我不能再使用$data['playername'][$i] 来访问玩家名的值。
  • 好吧,我调查了一下:他实际上做了一些“排序”。但是,他没有按“pts”的值进行排序,而是重新排列了数组的顺序,所以现在的顺序是“playername”、“pts”、“team”,而不是“playername”、“team”、“pts”。

标签: php arrays multidimensional-array


【解决方案1】:

我希望你的数据数组是正确的,但假设它看起来像这样:

$data = [

    [
        'playername' =>'Player A',
        'team' => 'Team A',
        'pts' => 10
    ],
    [
        'playername' =>'Player B',
        'team' => 'Team B',
        'pts' => 20
    ],
    [
        'playername' =>'Player C',
        'team' => 'Team C',
        'pts' => 5
    ],
];

使用usort,您可以这样排序:

usort($data, function ($a, $b) {

    if ($a['pts'] == $b['pts']) {
    
        return 0;
    }

    return ($a['pts'] < $b['pts']) ? 1 : -1;
});

您可以在PHPSandbox 上使用代码。

如果您想按玩家的升序对玩家进行排序,只需翻转排序表达式即可:

return ($a['pts'] < $b['pts']) ? -1 : 1;

如果要按球员或球队名称排序,只需替换排序条件即可:

usort($data, function ($a, $b) {

    if ($a['team'] == $b['team']) {
    
        return 0;
    }

    return ($a['team'] < $b['team']) ? 1 : -1;
});

使用 spaceship 运算符作为简写符号:

return $a['pts'] <=> $b['pts']; // Ascending
return $b['pts'] <=> $a['pts']; // Descending

【讨论】:

  • 太好了,我的荣幸。也许你会考虑接受我的回答?
【解决方案2】:
$players = [
    ['playername' =>'Player A','team' => 'Team A','pts' => 10],
    ['playername' =>'Player B','team' => 'Team B','pts' => 20],
    ['playername' =>'Player C','team' => 'Team C','pts' => 5]
];
function pointsASC($player1, $player2){
    if ($player1['pts'] == $player2['pts']) {
        return 0;
    }elseif($player1['pts'] < $player2['pts']){
        return 1;
    }elseif($player1['pts'] > $player2['pts']){
        return -1;
    }
}
usort($players,'pointsASC');
echo "<pre>";
print_r($players);
/*
[
    ['playername' =>'Player B','team' => 'Team B','pts' => 20],
    ['playername' =>'Player A','team' => 'Team A','pts' => 10],
    ['playername' =>'Player C','team' => 'Team C','pts' => 5]
];
*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多