php - PHP 按两个条件对数组进行排序
问题描述
我有一个这样的数组:
$arr = [
0 => [
'a' => 0,
'b' => 150
],
1 => [
'a' => 1,
'b' => 155
],
2 => [
'a' => 0,
'b' => 131
],
3 => [
'a' => 2,
'b' => 241
],
4 => [
'a' => 2,
'b' => 45
],
5 => [
'a' => 1,
'b' => 23
],
6 => [
'a' => 0,
'b' => 78
],
7 => [
'a' => 0,
'b' => 123
],
8 => [
'a' => 1,
'b' => 412
],
9 => [
'a' => 0,
'b' => 22
],
10 => [
'a' => 0,
'b' => 11
],
11 => [
'a' => 2,
'b' => 100
],
12 => [
'a' => 2,
'b' => 105
],
13 => [
'a' => 1,
'b' => 18
]
];
我想首先按'a'属性对数组进行排序,所以所有0、所有1和所有2应该在一起,然后所有'b'应该从最低到最高排序。我希望你知道我的意思。我可以将它分成三个数组,然后对每个数组进行排序,然后将它们重新组合在一起,但我希望有一个更短更好的解决方案。
解决方案
只是想解释为什么你最初尝试的东西不起作用。
return a['a'] - b['a'] || a['b'] - b['b']
||
是一个逻辑运算符,因此当您使用它时,整个表达式将被评估为布尔值,因此唯一可能的值是true
或false
(或数字,因为usort
比较函数应该返回,0 或 1)。由于没有一个比较在 的两边都以零结束,所以||
它们都评估为true
,所以没有发生排序。
使用?:
instead 有效,因为它不会将整个表达式评估为布尔值,它会评估第一部分并返回结果,除非它为零(相等值),在这种情况下它会继续评估第二部分并返回结果那个。
显示 3v4l.org 上两次比较之间差异的示例:https ://3v4l.org/32IPa
不过,您实际上可以更简单地对该数组进行排序。
sort($arr);
将工作。但是,您不能总是指望它对数组进行排序。它只适用于这种情况,因为所有内部数组都具有相同的键,并且您希望按第一个键排序,然后是第二个键。(您可以在此处的“Example #2 Transcription of standard array comparison”中查看如何比较数组。)
推荐阅读
- php - 创建新页面而不创建新文件
- android - 存储单个字符串的内容提供程序
- .net-core - 是否可以使用一个共享框架发布多个自包含的 .Net Core 应用程序
- indexing - Solr 索引文档很晚
- angular - 添加查询参数时Angular 5路由器不匹配
- c++ - 当我在 libtorrent 上调用 dht_get_item 时,警报说该项目未初始化
- java - 使用 Criteria API 根据条件计算加入表的结果
- php - 通过php登录instagram
- mongoose - 在 Post Hooks 中修改 Mongoose 对象
- c - 用逗号分隔的十六进制值将文件读入C中的数组