我已经进行了一些研究,包括经历了PHP Sort Array By SubArray Value,但这是一个变化形式:
我有一个如下数组:
$data =
[
0 => [
'id' => (int) 5,
'name' => 'Foo',
'group_id' => (int) 1,
],
1 => [
'id' => (int) 6,
'name' => 'Bar',
'group_id' => (int) 1,
],
2 => [
'id' => (int) 8,
'name' => 'Baz',
'group_id' => (int) 7,
],
3 => [
'id' => (int) 9,
'name' => 'ABC',
'group_id' => (int) 2,
],
4 => [
'id' => (int) 10,
'name' => 'DEF',
'group_id' => (int) 65,
]
];
我还有group_id
的第二个数组,它们与用户执行的搜索有关:
$gids = [7, 65];
我要做的是根据$data
中的值,按group_id
的顺序$gids
排序。因此$data
的顺序应变为:
0 => [
'id' => (int) 8,
'name' => 'Baz',
'group_id' => (int) 7,
],
1 => [
'id' => (int) 10,
'name' => 'DEF',
'group_id' => (int) 65,
]
2 => [
'id' => (int) 5,
'name' => 'Foo',
'group_id' => (int) 1,
],
3 => [
'id' => (int) 6,
'name' => 'Bar',
'group_id' => (int) 1,
],
4 => [
'id' => (int) 9,
'name' => 'ABC',
'group_id' => (int) 2,
],
请注意,一旦考虑到$gids
数组,group_id
中其余项的$data
就为数字(在这种情况下,升序为:1, 1, 2
)
我知道可以使用usort
和一个匿名函数,例如
usort($data, function ($gids) {
});
但是,我不知道在该函数中写什么以这种方式执行排序?我最初的想法是先做foreach($gids)
,然后再做foreach($data)
,然后比较group_id
的值。但是我不知道如何修改$data
使其重新排序。
请有人帮忙吗?
同样,如果已经有一篇文章说明如何执行此操作,请告诉我,因为我在这里找不到人。原始链接只是基于数字顺序,而不是基于第二个数组(等效于$gids
)。
使用PHP 7.1.0
答案 0 :(得分:3)
这应该可以解决问题
usort($data, function($a, $b) use ($gids)
{
$posA = array_search($a['group_id'], $gids);
if ($posA === false) {
$posA = 9999;
}
$posB = array_search($b['group_id'], $gids);
if ($posB === false) {
$posB = 9999;
}
return $posA - $posB;
});
如果在$ gids数组中找到,则将使用$ gids的排序,否则元素将保持其顺序。
我得到的回报如下:
array:5 [▼0 => array:3 [▼ “ id” => 8 “名称” =>“巴兹” “ group_id” => 7] 1 =>数组:3 [▼ “ id” => 10 “名称” =>“ DEF” “ group_id” => 65] 2 =>数组:3 [▼ “ id” => 5 “名称” =>“ Foo” “ group_id” => 1] 3 =>数组:3 [▼ “ id” => 6 “名称” =>“酒吧” “ group_id” => 1] 4 =>数组:3 [▼ “ id” => 9 “名称” =>“ ABC” “ group_id” => 2]]