PHP数组在循环中分组并创建多维数组
我有一个关联多维数组,如下所示PHP数组在循环中分组并创建多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个关联多维数组,如下所示 $data = array(); $data = Array ( [0] => Array ( [class] => 1styear [branch] => IT [Exam] => SEM1 [student name] => Alex [Bio] => Good Boy ) [1] => Array ( [class] => 2ndyear [branch] => Finance [Exa
$data = array();
$data = Array (
[0] => Array ( [class] => 1styear [branch] => IT [Exam] => SEM1 [student name] => Alex [Bio] => Good Boy )
[1] => Array ( [class] => 2ndyear [branch] => Finance [Exam] => SEM1 [student name] => Mark [Bio] => Intelligent )
[2] => Array ( [class] => 2ndyear [branch] => IT [Exam] => SEM1 [student name] => Shaun [Bio] => Football Player )
[3] => Array ( [class] => 1styear [branch] => Finance [Exam] => SEM2 [student name] => Mike [Bio] => Sport Player )
[4] => Array ( [class] => 1styear [branch] => IT [Exam] => SEM2 [student name] => Martin [Bio] => Smart )
[5] => Array ( [class] => 1styear [branch] => IT [Exam] => SEM1 [student name] => Philip [Bio] => Programmer )
)
我需要根据上面数组中的类似元素创建新数组。意味着我必须创建数组组。例如,类元素具有重复的1styear和2ndyear值。所以它应该创建唯一元素的数组。然后类是父数组,类数组内部应该有基于分支的数组,分支考试数组内部和考试数组内部应该有学生姓名和bio的关联数组
所以基本上数组应该是这样的
array(
"1styear" => array(
"IT" => array(
"SEM1" => array(
array(
"student name" => "Alex",
"Bio" => "Good Boy"
),
array(
"student name" => "Philip",
"Bio" => "Programmer"
)
),
"SEM2" => array(
array(
"student name" => "Martin",
"Bio" => "Smart"
)
)
)
),
"2ndyear" => array(
"Finance" => array(
"SEM1" => array(
array(
"student name" => "Mark",
"Bio" => "Intelligent"
)
),
"SEM2" => array(
array(
"student name" => "Mike",
"Bio" => "Sport Player"
)
)
)
)
);
为了使组基于类,我喜欢下面的工作很好,但如何在其中创建数组
$classgroup = array();
foreach($data as $inarray){
$classgroup[$inarray['class']][] = $inarray;
}
$classarray = array();
foreach($classgroup as $key => $value){
echo $key; // output is 1styear and secondyear
create array like above
}
-------------------------------------编辑---------------------------
从下面的循环
foreach($data as $array){
$grouped[$array["class"]][$array["branch"]][$array["Exam"]][]=array("student name"=>$array["student name"],"Bio"=>$array["Bio"]);
}
我收到了预期的订单
但如果我需要另一个这样的o/p
array(
"1styear" => array(
"IT" => array(
"SEM1" => array(
array(
"student name" => "Alex",
"Bio" => "Good Boy"
),
array(
"student name" => "Philip",
"Bio" => "Programmer"
)
),
"SEM2" => array(
array(
"student name" => "Martin",
"Bio" => "Smart"
)
)
)
),
"2ndyear" => array(
"Finance" => array(
"SEM1" => array(
array(
"student name" => "Mark",
"Bio" => "Intelligent"
)
),
"SEM2" => array(
array(
"student name" => "Mike",
"Bio" => "Sport Player"
)
)
)
)
);
预期o/p
array(
'1styear' =>
array (
0 =>
array(
'Exam' => 'SEM1',
'branch' =>
array (
0 => 'IT'
),
),
1 =>
array(
'Exam' => 'SEM2',
'branch' =>
array (
0 => 'IT'
),
),
),
'2ndyear' =>
array (
0 =>
array(
'Exam' => 'SEM1',
'branch' =>
array (
0 => 'Finance',
),
),
1 =>
array(
'Exam' => 'SEM2',
'branch' =>
array (
0 => 'Finance'
),
)
),
)
我尝试了以下循环,但没有得到预期的o/p
foreach($data as $array){
$grouped[$array["class"]][]=array("Exam"=>$array["Exam"],"branch"=>$array["branch"]);
}
可能是这样的(未经测试)
一圈一行
foreach($data as $array){
$grouped[$array["class"]][$array["branch"]][$array["Exam"]][]=array("student name"=>$array["student name"],"Bio"=>$array["Bio"]);
}
$grouped
产生:
Array(
[1styear] => Array(
[IT] => Array(
[SEM1] => array(
[0] => array(
[student name] => Alex,
[Bio] => Good Boy
),
[1] => array(
[student name] => Philip,
[Bio] => Programmer
)
),
[SEM2] => array(
[0] => array(
[student name] => Martin,
[Bio] => Smart
)
)
),
[Finance] => array(
[SEM2] => array(
[0] => array(
[student name] => Mike,
[Bio] => Sport Player
)
)
)
),
[2ndyear] => array(
[Finance] => array(
[SEM1] => array(
[0] => array(
[student name] => Mark,
[Bio] => Intelligent
)
)
),
[IT] => array(
[SEM1] => array(
[0] => array(
[student name] => Shaun,
[Bio] => Football Player
)
)
)
)
)
你的后续案例更有趣/更具挑战性。我不得不去掉一些我不常玩的功能。看看这个:
<?php
$data = array (
array ( "class"=>"1styear","branch"=>"IT","Exam"=>"SEM1","student name"=>"Alex","Bio"=>"Good Boy"),
array ( "class"=>"2ndyear","branch"=>"Finance","Exam"=>"SEM1","student name"=>"Mark","Bio"=>"Intelligent" ),
array ( "class"=>"2ndyear", "branch"=>"IT","Exam"=>"SEM1","student name"=>"Shaun","Bio"=>"Football Player" ),
array ( "class"=>"1styear","branch"=>"Finance","Exam"=>"SEM2","student name"=>"Mike","Bio"=>"Sport Player" ),
array ( "class"=>"1styear","branch"=>"IT","Exam"=>"SEM2","student name"=>"Martin","Bio"=>"Smart"),
array ( "class"=>"1styear","branch"=>"IT","Exam"=>"SEM1","student name"=>"Philip","Bio"=>"Programmer" )
);
$class_keys=array_unique(array_column($data,"class")); // create array of unique class values
$Exam_keys=array_unique(array_column($data,"Exam")); // create array of unique Exam values
foreach($class_keys as $class_key){
$i=0; // "class" subarray index
foreach($Exam_keys as $Exam_key){
$q=array("class"=>$class_key,"Exam"=>$Exam_key); // this array can have 1 or more pairs
// create an array only of rows where $q's key-value pairs exist
$qualifying_array=array_filter(
$data,
function($val)use($q){
if(count(array_intersect_assoc($val,$q))==count($q)){ // total pairs found = total pairs sought
return $val;
}
},
ARRAY_FILTER_USE_BOTH
);
foreach($qualifying_array as $qa){ // push appropriate values into array
$grouped2[$class_key][$i]["Exam"]=$qa["Exam"];
$grouped2[$class_key][$i]["branch"][]=$qa["branch"];
}
if(isset($grouped2[$class_key][$i]["branch"])){ // ensure no duplicate values in "branch" subarray
$grouped2[$class_key][$i]["branch"]=array_unique($grouped2[$class_key][$i]["branch"]);
}
++$i; // increment the index for each "class" subarray
}
}
echo "<pre>";
print_r($grouped2);
echo "</pre>";
@米老鼠array@mickmackusa我已经提到了O/P应该是什么,在上面的答案中看到“基本上数组应该是这样的”。如果要保留关联键,请在
[]=
之前按顺序命名它们,然后将所有索引/嵌套数组放置在=
之后。如果您需要更多信息,只需提问(如果与此问题偏离太多,您可能需要单独提问。无论哪种方式,我都乐意帮忙。这就是brilliance tnx。预期o/p。如果我只希望分支数组中的数组('finance','it')而不是数组([0]=>finance,[1]=>it),该怎么办@webpic您可以删除=符号前的空方括号,但每次出现时它都会覆盖该循环的分支值(如果有多个)。如果使用该技术,您可以删除以下isset条件块,因为永远不会有重复项要删除。如果我删除[]从循环中,它将只接受单个值,我只需要删除它们的索引(键)只保留values@webpic简言之,不能两全其美。如果要存储多个值,则有两种选择:创建数组,或将值作为单个字符串连接。如果您确切知道分隔字符串在显示时的外观,则可以连接字符串值。否则,这是我的建议,将多个值存储在数组中。所有数组值都需要一个键才能存在——它们可以是整数或字符串,无论哪种方式,这都不会对您的使用产生负面影响。
array(
[1styear]=>array(
[0]=>array(
[Exam]=>SEM1
[branch]=>array(
[0]=>IT
)
),
[1]=>array(
[Exam]=>SEM2
[branch]=>array(
[0]=>Finance,
[1]=>IT
)
)
),
[2ndyear]=>array(
[0]=>array(
[Exam]=>SEM1
[branch]=>array(
[0]=>Finance,
[1]=>IT
)
)
)
)