我有两个数组,一个是保存信息的多维数组,另一个是一个简单的数组,它保存了我想要第一个数组的顺序的值。
例如,我希望我的第一个数组按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数组中每个元素的值。
答案 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来处理它们。如果你是一个初学者,它可能会让人不知所措,但你必须学习这一点,因为这就是现在的工作方式。