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,即使它多次出现,我也不明白。Ivar_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
)
)
)