Группировка по общим ключам массива - PullRequest
0 голосов
/ 30 апреля 2018
$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'
    ]
];

Я хочу сгруппировать результат по 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'
    ], [
      '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'
    ]
  ]
];

В настоящее время у меня есть это:

$groups = [];
$modules = array();

Я перебираю массив $sortMod и группирую его по group_id, где появляется несколько module_id, т.е. group_id 2 и 3 содержит несколько модулей. Так что результат будет выглядеть так, как указано выше. Хотя я знаю, что для переменной флага $groupExist по умолчанию установлено значение false, а когда группа помещается в массив $groups, значение устанавливается в значение false. Затем выполните оператор if, чтобы проверить, является ли значение истинным, а затем введите только значения модуля:

foreach($sortMod as $val) {
  if(!array_key_exists($val['group_id'],$groups)){
    $groups[$val['group_id']] = [];
  }
  $groups[$val['group_id']][] = $val;
} 


echo '<pre>';
print_r($groups);
echo '<pre>';

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Вы можете добавить свой $val в группу, используя group_id. Если вы найдете этот ключ, вы можете создать ключ group_id. Если вы найдете его снова, и это массив, добавьте к нему.

$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
                )

        )

)
0 голосов
/ 30 апреля 2018

Вы можете использовать array_reduce для группировки массива. Если вы не хотите создавать многомерный массив, если в группе только один элемент, вы можете использовать array_map

<code>$sortMod = .. //Your array here.

$grouped = array_reduce($sortMod, function($c, $v){
    $c[ $v['group_id'] ][] = $v;
    return $c;
}, array());

$result = array_map(function ($n) {
    if ( count($n) === 1 ) return $n[0];       //Since the group has one element. Return the element 0.

    $newN = array();                           //Contruct the new format for 2 or more elements.
    $newN['group_id'] = $n[0]['group_id'];     //Add the group_id
    foreach($n as $value)                      //Loop thru the array, remove the group_id and push.
    {
        unset($value['group_id']);
        $newN[] = $value;
    }

    return $newN;
}, $grouped );

echo "<pre>";
print_r( $result );
echo "
";

Это приведет к:

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
                )

        )

)
0 голосов
/ 30 апреля 2018

Добавление нескольких небольших модификаций в ваш код приведет к чему-то подобному

$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>';
0 голосов
/ 30 апреля 2018

Вы можете использовать универсальную пользовательскую функцию, например, так:

function array_group_by($a, $i, $rem = true){
  foreach($a as $v){
    $k = $v[$i];
    if($rem){
      unset($v[$i]);
    }
    $t[$k][] = $v;
  }

  return $t;
}

echo '<pre>';
print_r(array_group_by($sortMod, 'group_id'));
echo '<pre>';

И здесь - это выход.

A group id в любом случае должен быть уникальным, хотя этот вывод не тот, который вы специально хотели, он делает более пригодный для использования массив для циклического повторения.

Первый ключ - идентификатор группы. Следующие массивы, содержащиеся в массиве групп, являются «модулями».

При желании вы можете использовать array_group_by($sortMod, 'group_id', false);, чтобы сохранить group_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'];
  }
}

На мой взгляд, короткий и многократно используемый код - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...