按键的子数组是否存在对关联数组进行排序

Order array of associative arrays by sub-array existence of key

提问人:Marcos 'HaddocK' Pérez 提问时间:11/16/2023 最后编辑:Marcos 'HaddocK' Pérez 更新时间:11/16/2023 访问量:40

问:

对不起,这个标题非常糟糕,我真的不知道该如何单行。

我有一个具有这种结构的数组

$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
  • 等等......
PHP 排序

评论

0赞 hassan 11/16/2023
到目前为止,你做了什么来实现这一目标?
0赞 Marcos 'HaddocK' Pérez 11/16/2023
到目前为止,我使用 uasorting 来尝试实现这一目标,但除了没有完成它之外,我觉得我没有做正确的事情
0赞 brombeer 11/16/2023
编辑您的问题并在那里发布您的代码。谢谢
0赞 nice_dev 11/16/2023
@Marcos'HaddocK'Pérez 所以应该先来还是..?admin + readeradmin + writer
0赞 Marcos 'HaddocK' Pérez 11/16/2023
@nice_dev 如果我可以选择,我会按字母顺序取下一个值!

答:

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:很高兴为您指明正确的方向。