Php 按公共数组键分组

Php 按公共数组键分组,php,multidimensional-array,Php,Multidimensional Array,我想按group_id对结果进行分组 $sortMod = [ [ 'group_id' => 1, 'group_name'=>'Home', 'module_id' => 1, 'mod_name' => 'Home', 'mod_link' => '/home', 'var_name' => 'home' ], [ 'g

我想按
group_id
对结果进行分组

$sortMod = [
    [
        'group_id'  => 1,
        'group_name'=>'Home',
        'module_id' => 1,
        'mod_name'  => 'Home',
        'mod_link'  => '/home',
        'var_name'  => 'home'
    ], [
        'group_id'=> 2,
        'module_id' => 2,
        'mod_name' => 'Numbers',
        'mod_link' => '/number_mapping',
        'var_name' => 'numbermap'
    ], [
        'group_id'=> 2,
        'module_id' => 70,
        'mod_name' => 'DR Plan',
        'mod_link' => '/dr_plan',
        'var_name' => 'dr_plan'
    ], [
        'group_id'=> 3,
        'module_id' => 8,
        'mod_name' => 'Reporting',
        'mod_link' => '/reporting',
        'var_name' => 'reporting'
    ], [
        'group_id'=> 3,
        'module_id' => 80,
        'mod_name' => 'Scheduler',
        'mod_link' => '/scheduler',
        'var_name' => 'scheduler'
    ]
];
目前我有:

$sortMod = [
  [
    'group_id'  => 1,
    'group_name'=>'Home',
    'module_id' => 1,
    'mod_name'  => 'Home',
    'mod_link'  => '/home',
    'var_name'  => 'home'
  ], [
    'group_id'=> 2,
    [
      'module_id' => 2,
      'mod_name' => 'Numbers',
      'mod_link' => '/number_mapping',
      'var_name' => 'numbermap'
    ], [
      'module_id' => 70,
      'mod_name' => 'DR Plan',
      'mod_link' => '/dr_plan',
      'var_name' => 'dr_plan'
    ]
  ], [
    'group_id'=> 3,
    [
      'module_id' => 8,
      'mod_name' => 'Reporting',
      'mod_link' => '/reporting',
      'var_name' => 'reporting'
    ], [
      'module_id' => 80,
      'mod_name' => 'Scheduler',
      'mod_link' => '/scheduler',
      'var_name' => 'scheduler'
    ]
  ]
];
我正在迭代数组
$sortMod
并按
组id
将其分组,其中出现多个
模块id
,即
组id
2和3中有多个模块。因此,结果将如上所述。虽然我知道可以将标志变量
$groupExist
默认设置为false,但当将组推入
$groups
数组时,该值设置为false。然后使用if语句检查值是否为true,然后只推送模块值:

$groups = [];
$modules = array();
foreach($sortMod作为$val){
如果(!array_key_存在($val['group_id',$groups)){
$groups[$val['group_id']]=[];
}
$groups[$val['group_id'][]=$val;
} 
回声';
打印(组);
回声';

您可以使用如下通用自定义函数:

foreach(array_group_by($sortMod, 'group_id') as $groupid => $modules){
  echo "$groupid is the group_id and contains " . count($modules) . " modules";
  foreach($modules as $module){
    echo "Hi from " . $module['module_id'];
  }
}

在我看来,简短且可重用的代码是一条出路。

您可以使用如下通用自定义函数:

foreach(array_group_by($sortMod, 'group_id') as $groupid => $modules){
  echo "$groupid is the group_id and contains " . count($modules) . " modules";
  foreach($modules as $module){
    echo "Hi from " . $module['module_id'];
  }
}

在我看来,简短且可重用的代码是一条出路。

您可以使用
array\u reduce
对数组进行分组。如果您不想在组只有一个元素时创建多维数组,可以使用
array\u map

$groups = [];
foreach($sortMod as $val)
{
    $group_id = $val['group_id'];

    if (!isset($groups[$group_id])) { // First case
        $groups[$group_id] = $val ;
        continue;
    }

    // regroup if 'group_id' is not an array
    if (!is_array($groups[$group_id]['group_id']))
    {
        unset($groups[$group_id]['group_id']);
        $groups[$group_id] = ['group_id' => $group_id, $groups[$group_id]] ;
    }

    // append the new group
    unset($val['group_id']);
    $groups[$group_id][] = $val ;
}
// optionnal (to remove group_id keys)
$groups = array_values($groups);
print_r($groups);

您可以使用
array\u reduce
对数组进行分组。如果您不想在组只有一个元素时创建多维数组,可以使用
array\u map

$groups = [];
foreach($sortMod as $val)
{
    $group_id = $val['group_id'];

    if (!isset($groups[$group_id])) { // First case
        $groups[$group_id] = $val ;
        continue;
    }

    // regroup if 'group_id' is not an array
    if (!is_array($groups[$group_id]['group_id']))
    {
        unset($groups[$group_id]['group_id']);
        $groups[$group_id] = ['group_id' => $group_id, $groups[$group_id]] ;
    }

    // append the new group
    unset($val['group_id']);
    $groups[$group_id][] = $val ;
}
// optionnal (to remove group_id keys)
$groups = array_values($groups);
print_r($groups);

在代码中添加一些小的修改会产生类似的结果

$group=[];
foreach($sortMod作为$val){
$current_id=$val['group_id'];
未设置($val['group_id']);
如果(!array_key_存在($current_id,$group)){
$group[$current_id]=array();
}
$group[$current_id][]=$val;
}
回声';
打印(组);
回声';

在代码中添加一些小修改会产生类似的结果

$group=[];
foreach($sortMod作为$val){
$current_id=$val['group_id'];
未设置($val['group_id']);
如果(!array_key_存在($current_id,$group)){
$group[$current_id]=array();
}
$group[$current_id][]=$val;
}
回声';
打印(组);
回声';

您可以使用
组id将
$val
添加到组中。如果找到此键,则可以创建
组id
键。如果您再次找到它,并且它是一个数组,请附加到它

产出:


您可以使用
组id
$val
添加到组中。如果找到此键,则可以创建
组id
键。如果您再次找到它,并且它是一个数组,请附加到它

产出:


我不明白。我
var\u dump()
你的代码,这似乎就是你问的方式?还是不?编辑:没关系,我知道区别在哪里。不是所有的,我希望预期结果是这样的:['group\u id'=>2,['module\u id'=>2,'mod\u name'=>'Numbers','mod\u link'=>'/number\u mapping','var\u name'=>'numbermap'],['module_id'=>70,'mod_name'=>'DR Plan','mod_link'=>'/DR_Plan','var_name'=>'DR_Plan']],['group_id'=>3,[@GytisTenovimas此时为每个模块id创建了组id,即使它多次出现,我也不明白。I
var_dump()
你的代码和你问的似乎是一样的?或者不是?编辑:没关系,我知道区别在哪里。不是所有的,我希望预期的结果是这样的:[['group\u id'=>2,['module\u id'=>2,'mod\u name'=>'Numbers','mod link'=>'/number\u mapping',var\u name'=>'numbermap'],['module_id'=>70,'mod_name'=>'DR Plan','mod_link'=>'/DR_Plan','var_name'=>'DR_Plan']],['group_id'=>3,[@GytisTenovimas目前为每个模块创建了组id,尽管它多次出现。非常感谢@GytisTenovimas像一个符咒一样工作!很高兴帮助@Raphael:)你的也很棒@Syscall:)非常感谢@GytisTenovimas像一个符咒一样工作!很高兴帮助@Raphael:)你的@Syscall:)也很棒
Array
(
    [1] => Array
        (
            [group_id] => 1
            [group_name] => Home
            [module_id] => 1
            [mod_name] => Home
            [mod_link] => /home
            [var_name] => home
        )

    [2] => Array
        (
            [group_id] => 2
            [0] => Array
                (
                    [module_id] => 2
                    [mod_name] => Numbers
                    [mod_link] => /number_mapping
                    [var_name] => numbermap
                )

            [1] => Array
                (
                    [module_id] => 70
                    [mod_name] => DR Plan
                    [mod_link] => /dr_plan
                    [var_name] => dr_plan
                )

        )

    [3] => Array
        (
            [group_id] => 3
            [0] => Array
                (
                    [module_id] => 8
                    [mod_name] => Reporting
                    [mod_link] => /reporting
                    [var_name] => reporting
                )

            [1] => Array
                (
                    [module_id] => 80
                    [mod_name] => Scheduler
                    [mod_link] => /scheduler
                    [var_name] => scheduler
                )

        )

)
$group = [];
foreach ($sortMod as $val){
    $current_id = $val['group_id'];
    unset($val['group_id']);
    if (!array_key_exists($current_id ,$group)){
        $group[$current_id] = array();
    }
    $group[$current_id][] = $val;
}

echo '<pre>';
print_r($groups);
echo '<pre>';
$groups = [];
foreach($sortMod as $val)
{
    $group_id = $val['group_id'];

    if (!isset($groups[$group_id])) { // First case
        $groups[$group_id] = $val ;
        continue;
    }

    // regroup if 'group_id' is not an array
    if (!is_array($groups[$group_id]['group_id']))
    {
        unset($groups[$group_id]['group_id']);
        $groups[$group_id] = ['group_id' => $group_id, $groups[$group_id]] ;
    }

    // append the new group
    unset($val['group_id']);
    $groups[$group_id][] = $val ;
}
// optionnal (to remove group_id keys)
$groups = array_values($groups);
print_r($groups);
Array
(
    [0] => Array
        (
            [group_id] => 1
            [group_name] => Home
            [module_id] => 1
            [mod_name] => Home
            [mod_link] => /home
            [var_name] => home
        )

    [1] => Array
        (
            [group_id] => 2
            [0] => Array
                (
                    [module_id] => 2
                    [mod_name] => Numbers
                    [mod_link] => /number_mapping
                    [var_name] => numbermap
                )

            [1] => Array
                (
                    [module_id] => 70
                    [mod_name] => DR Plan
                    [mod_link] => /dr_plan
                    [var_name] => dr_plan
                )

        )

    [2] => Array
        (
            [group_id] => 3
            [0] => Array
                (
                    [module_id] => 8
                    [mod_name] => Reporting
                    [mod_link] => /reporting
                    [var_name] => reporting
                )

            [1] => Array
                (
                    [module_id] => 80
                    [mod_name] => Scheduler
                    [mod_link] => /scheduler
                    [var_name] => scheduler
                )

        )

)