提问人:Marcos 'HaddocK' Pérez 提问时间:11/16/2023 最后编辑:Marcos 'HaddocK' Pérez 更新时间:11/16/2023 访问量:40
按键的子数组是否存在对关联数组进行排序
Order array of associative arrays by sub-array existence of key
问:
对不起,这个标题非常糟糕,我真的不知道该如何单行。
我有一个具有这种结构的数组
$users = [
[
"name" => "Marcos",
"roles" => [
"admin" => "2023-11-16T10:23:45Z",
"reader" => "2023-11-16T10:24:23Z"
]
],
[
"name" => "Roberto",
"roles" => [
"admin" => "2023-11-16T10:23:45Z",
]
],
[
"name" => "Jaime",
"roles" => [
"admin" => "2023-11-16T10:23:45Z",
"writer" => "2023-11-16T10:24:23Z"
]
],
[
"name" => "Xabier",
"roles" => [
"roles" => [
"admin" => "2023-11-16T10:23:45Z",
"writer" => "2023-11-16T10:24:23Z",
"reader" => "2023-11-16T10:24:23Z"
]
]
]
];
如果所有用户都出现在此数组中,则他们都是管理员。
我想根据用户拥有的角色对用户进行排序,并逐步增加,角色偏好按字母顺序优先:
- 第一管理员
- 然后是 admin + role1
- 然后是管理员 + 角色 1 + 角色 2
- 然后是 admin + role2
- 等等......
答:
1赞
nice_dev
11/16/2023
#1
角色首选项按字母顺序优先。
这告诉我们,我们需要对数组的键进行排序。我们可以通过 ksort
来做到这一点。roles
第一管理员
然后是 admin + role1
然后是管理员 + 角色 1 + 角色 2
然后是 admin + role2
我们必须有一种方法可以逐个比较键,并在 usort
的自定义回调函数中相应地返回值。roles
为了使我们的代码更紧凑,这个技巧是将数组的键(排序后)内爆到管道 symbol() 或您喜欢的任何其他分隔符上,并将其传递给我们的 strcmp
函数。roles
|
片段:
<?php
foreach($users as &$u){
ksort($u['roles']); // so that we don't sort this every time during comparison which is time consuming and not efficient.
}
usort($users, fn($a, $b) => strcmp(
implode("|", array_keys($a['roles'])),
implode("|", array_keys($b['roles']))
)
);
print_r($users);
评论
1赞
Marcos 'HaddocK' Pérez
11/16/2023
非常感谢您的好方法,这是最合适的,而且看起来很理想!
0赞
nice_dev
11/16/2023
@Marcos'HaddocK'Pérez:很高兴为您指明正确的方向。
评论
admin + reader
admin + writer