使用 usort 和 spaceship 运算符正确排序多维数组
Properly sorting multidimensional array using usort and spaceship operator
我需要按照以下逻辑对以下数组进行排序:如果 'score' 相同,我想使用 'time' 进行比较。数组如下:
$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 array :
$user_scores = [ 34 => [ 'score' => 1, 'time' => 5.646 ],
82 => [ 'score' => 1, 'time' => 6.442 ],
66 => [ 'score' => 3, 'time' => 1.554 ]
]
如果你能告诉我如何使用宇宙飞船操作符来完成这项工作(如果有意义的话),我将不胜感激。感谢您的宝贵时间,期待您的回复。
---更新---
需要的排序逻辑是这样的:
- 分数越高,排名越高。
- 时间越高,排名越低。
它基本上是对测验结果进行排序。时间最少的得分最高的人将排在首位;那些得分较低和时间较长的人将排在最后。
要保留密钥,您只需要使用 uasort()
。
我推荐宇宙飞船操作员进行 3 向比较(可从 PHP7 及更高版本获得)。
$result
在您的代码中只会 return true/false
所以这对您没有用。 sort()
'ing 函数不会分配给变量;他们直接修改输入数组。
向飞船操作员提供数组数据时,将比较前两个元素。如果存在差异,则 1
或 -1
将被 return 编辑。如果有平局(比较评估为 0
,则将评估接下来的两个元素。此行为将一直持续到发生非零评估或没有更多元素可迭代为止。这是相当 clean/readable 要实现的语法。
要按降序排序,请在左侧写入 $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,
),
)
我需要按照以下逻辑对以下数组进行排序:如果 'score' 相同,我想使用 'time' 进行比较。数组如下:
$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 array :
$user_scores = [ 34 => [ 'score' => 1, 'time' => 5.646 ],
82 => [ 'score' => 1, 'time' => 6.442 ],
66 => [ 'score' => 3, 'time' => 1.554 ]
]
如果你能告诉我如何使用宇宙飞船操作符来完成这项工作(如果有意义的话),我将不胜感激。感谢您的宝贵时间,期待您的回复。
---更新---
需要的排序逻辑是这样的:
- 分数越高,排名越高。
- 时间越高,排名越低。
它基本上是对测验结果进行排序。时间最少的得分最高的人将排在首位;那些得分较低和时间较长的人将排在最后。
要保留密钥,您只需要使用 uasort()
。
我推荐宇宙飞船操作员进行 3 向比较(可从 PHP7 及更高版本获得)。
$result
在您的代码中只会 return true/false
所以这对您没有用。 sort()
'ing 函数不会分配给变量;他们直接修改输入数组。
向飞船操作员提供数组数据时,将比较前两个元素。如果存在差异,则 1
或 -1
将被 return 编辑。如果有平局(比较评估为 0
,则将评估接下来的两个元素。此行为将一直持续到发生非零评估或没有更多元素可迭代为止。这是相当 clean/readable 要实现的语法。
要按降序排序,请在左侧写入 $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,
),
)