php - 使用 usort 和 spaceship 运算符正确排序多维数组

标签 php sorting multidimensional-array usort asort

我需要按照以下逻辑对以下数组进行排序:如果“分数”相同,我想使用“时间”进行比较。数组如下:

$user_scores = [ 82 => [ 'score' => 1, 'time' => 6.442 ],
                 34 => [ 'score' => 1, 'time' => 5.646 ],
                 66 => [ 'score' => 3, 'time' => 1.554 ]
               ]

上述数组中的“keys”是“user_ids”,我需要将其保存在排序后的数组中。到目前为止,我最好的尝试如下 -

$result = usort( $user_scores, function ( $a, $b ) {
    if ( $a['score'] == $b['score'] ) {
        return $a['time'] == $b['time'];
        }
    return $a['score'] <=> $b['score'];
} );

显然,这不起作用,我得到的 $user_scores 数组的所有键都替换为 0、1、2 而不是 user_ids(82、34 和 66)。排序也不起作用。

对于上面的数组,我想要的输出是 $user_scores 数组:

$user_scores = [ 34 => [ 'score' => 1, 'time' => 5.646 ],
                 82 => [ 'score' => 1, 'time' => 6.442 ],
                 66 => [ 'score' => 3, 'time' => 1.554 ]
               ]

如果您能告诉我如何使用宇宙飞船操作符(如果有意义的话)来完成这项工作,我将不胜感激。感谢您的宝贵时间,期待您的回复。

---更新---

需要的排序逻辑是这样的:

  1. 得分越高,排名越高。
  2. 时间越高,等级越低。

它基本上是对测验结果进行排序。时间最少的得分最高的人将排在首位;那些得分较低和时间较长的人将排在最后。

最佳答案

要保留 key ,您只需要使用 uasort()

我推荐宇宙飞船运算符(operator)进行 3 向比较(可从 PHP7 及更高版本获得)。

$result 在你的代码中只会返回 true/false 所以这对你没有用。 sort()'ing 函数不会分配给变量;他们直接修改输入数组。

当向飞船运算符(operator)提供数组数据时,将比较前两个元素。如果存在差异,则返回 1-1。如果有平局(比较评估为 0,则接下来的两个元素将被评估。这种行为会一直持续到出现非零评估或没有更多元素要迭代为止。这是一个相当要实现的干净/可读语法。

要按降序排序,请在左侧写入 $b 值,在右侧写入 $a 值。

代码:(Demo)

$user_scores = [
    82 => ['score' => 1, 'time' => 6.442],
    34 => ['score' => 1, 'time' => 5.646],
    66 => ['score' => 3, 'time' => 1.554],
    7  => ['score' => 2, 'time' => 4.442],
    99 => ['score' => 4, 'time' => 3.646],
    55 => ['score' => 1, 'time' => 2.554]
];

uasort($user_scores, function($a, $b) {
    return [$b['score'], $a['time']] <=> [$a['score'], $b['time']];
});
var_export($user_scores);

输出:

array (
  99 => 
  array (
    'score' => 4,
    'time' => 3.646,
  ),
  66 => 
  array (
    'score' => 3,
    'time' => 1.554,
  ),
  7 => 
  array (
    'score' => 2,
    'time' => 4.442,
  ),
  55 => 
  array (
    'score' => 1,
    'time' => 2.554,
  ),
  34 => 
  array (
    'score' => 1,
    'time' => 5.646,
  ),
  82 => 
  array (
    'score' => 1,
    'time' => 6.442,
  ),
)

关于php - 使用 usort 和 spaceship 运算符正确排序多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309585/

相关文章:

c - 编程新手,不懂2D/3D数组

c++ - 将 3D 数组作为结构成员存储在堆上

php - 如何使用 php 从 mysql 检索数据到 wysiwyg 编辑器

php - 通过 CRON 作业 PHP 处理 1000 个用户

php - 如何处理mysql数据库中的多个用户

C 二维数组 : Is the first 'level' an array of pointers?

php - 我如何将 php 集成到 html 表中

arrays - Swift - 对具有 bool 值和可选日期的人员数组进行排序

algorithm - 渐进式索引成语中的 APL 身份

mysql - Oracle/MYSQL : Sort records from a select query on a column that contains alphanumeric values