PHP - 按另一个数组的值

时间:2016-10-05 15:00:59

标签: php arrays sorting

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

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

$ users array:

array(3) {
    [0] => array(3) {
            'id' => 1,
            'name' => 'John Smith',
            'email' => 'john@example.com',
        },
    [2] => array(3) {
            'id' => 2,
            'name' => 'Jane Smith',
            'email' => 'jane@example.com',
        },
    [0] => array(3) {
            'id' => 3,
            'name' => 'Jack Smith',
            'email' => 'Jack@example.com',
        },
}

$ order array:

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

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

array(3) {
    [0] => array(3) {
            'id' => 2,
            'name' => 'Jane Smith',
            'email' => 'jane@example.com',
        },
    [2] => array(3) {
            'id' => 3,
            'name' => 'Jack Smith',
            'email' => 'jack@example.com',
        },
    [0] => array(3) {
            'id' => 1,
            'name' => 'John Smith',
            'email' => 'John@example.com',
        },
}

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

3 个答案:

答案 0 :(得分:0)

我认为这应该可以胜任:

{{1}}

它将通过子数组中“id”键的值对主数组进行排序。

答案 1 :(得分:0)

您可以使用usort来实现此目标:

        // the key order of each id
        $orderIdKeys  = array_flip($order);

        usort($users, function ($u1, $u2)  use ($orderIdKeys) {

            // compare the keys of the ids in the $order array
            return $orderIdKeys[$u1['id']] >= $orderIdKeys[$u2['id']] ?  1 : -1;
        });

然后应该订购$users

usort此处根据$ order数组中每个用户ID的位置($orderIdKeys[$u1['id']])比较用户,如果{{1}的位置 }}大于$u1['id']位置,回调返回1,这意味着$u2['id']应放在最终有序数组中$u2之前

答案 2 :(得分:0)

你可以这样做:

// 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数组中的值,实际上现在具有值id

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

Here is working example.