PHP - 按另一个数组的值对关联数组进行排序

标签 php arrays sorting

我有两个数组,一个是保存信息的多维数组,另一个是一个简单数组,它保存我想要第一个数组的顺序的值。

例如,我希望第一个数组按 ID 和第二个数组中的值排序。

$users 数组:

array(3) {
    [0] => array(3) {
            'id' => 1,
            'name' => 'John Smith',
            'email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="acc6c3c4c2ecc9d4cdc1dcc0c982cfc3c1" rel="noreferrer noopener nofollow">[email protected]</a>',
        },
    [2] => array(3) {
            'id' => 2,
            'name' => 'Jane Smith',
            'email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a707b747f5a7f627b776a767f34797577" rel="noreferrer noopener nofollow">[email protected]</a>',
        },
    [0] => array(3) {
            'id' => 3,
            'name' => 'Jack Smith',
            'email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e9a3888a82a98c91888499858cc78a8684" rel="noreferrer noopener nofollow">[email protected]</a>',
        },
}

$订单数组:

array(3) {
    [0] => '2',
    [1] => '3',
    [2] => '1',
}

我希望排序数组的结果是:

array(3) {
    [0] => array(3) {
            'id' => 2,
            'name' => 'Jane Smith',
            'email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b4ded5dad1f4d1ccd5d9c4d8d19ad7dbd9" rel="noreferrer noopener nofollow">[email protected]</a>',
        },
    [2] => array(3) {
            'id' => 3,
            'name' => 'Jack Smith',
            'email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5b313a38301b3e233a362b373e75383436" rel="noreferrer noopener nofollow">[email protected]</a>',
        },
    [0] => array(3) {
            'id' => 1,
            'name' => 'John Smith',
            'email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="de94b1b6b09ebba6bfb3aeb2bbf0bdb1b3" rel="noreferrer noopener nofollow">[email protected]</a>',
        },
}

正如您所看到的,我希望对数组键重新索引,因此它们始终从 0 开始按顺序排列,但 $users 数组中每个元素的值要重新排序。

最佳答案

你可以这样做:

// Index users by ID
$users = array_combine(
    array_column($users, 'id'),
    $users
);

// Order the users
$users = array_map(function ($id) use ($users) {
    return $users[$id];
}, $order);

这里我用了array_combine()函数,通过将给定的键映射到值来创建数组。对于键,我按顺序使用了所有 id(使用 array_column() 获取它们)。

有了这样形式的数组,我可以循环 $order 数组并按索引从 $users 数组中获取值,这些值实际上具有 >现在

我没有使用 foreach 循环,而是使用 array_map()功能。如果您有一个集合(即数组),最好使用 higher order functions来处理它们。如果您是初学者,这可能会让人不知所措,但您必须学习这一点,因为这就是当今的做法。

Here is working example.

关于PHP - 按另一个数组的值对关联数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39877512/

相关文章:

php - 使用 javascript 和 PHP 创建小部件

javascript - 比较用户数组字符串以列出空用户

javascript - 有没有办法输出字符而不是数字?

javascript - 这是遍历数组中数组的最佳方式吗

Javascript 基数排序

java - Android 按距离重新排序适配器

Php:设置 cookie 属性 SameSite=None 的 header ;Secure 根本不起作用

php - 如何使用 CDbMigration 从表中删除键

java - 根据第一个元素对子数组进行排序

php - 使用curl下载大文件时发生 fatal error