PHP-根据第二个数组,按子数组值对数组进行排序

时间:2018-10-24 10:35:27

标签: php arrays

我已经进行了一些研究,包括经历了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

1 个答案:

答案 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]]