簡體   English   中英

按通用陣列鍵分組

[英]Group by common array keys

$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_idgroup_id ,即group_id 2和3中有多個模塊。 因此結果將看起來像上面所說的。 盡管我知道我可以將標志變量$groupExist默認設置為false,並且在將組推入$groups數組時將其值設置為false。 然后使用if語句檢查該值是否為true,然后僅推送模塊值:

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>';

您可以使用array_reduce對數組進行分組。 如果在組只有一個元素的情況下不想創建多維數組,則可以使用array_map

$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 "</pre>";

這將導致:

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
                )

        )

)

您可以使用通用的自定義函數,如下所示:

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>';

是輸出。

group id仍然應該是唯一的,而該輸出並不是您特別想要的,它使數組更有用。

第一個鍵是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'];
  }
}

在我看來,短而可重用的代碼是必經之路。

在您的代碼中添加一些小的修改將產生類似的結果

$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>';

您可以使用group_id$val添加到組中。 如果找到此密鑰,則可以創建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
                )

        )

)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM