2017-02-26 173 views
4

我有一個關聯的多維陣列如下面PHP陣列組和創建多維陣列

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

我需要基於來自上述陣列類似元件上以創建新的數組。意味着我必須創建數組組。例如類元素具有重複的第一年和第二年的值。所以它會拋出一些獨特的元素。然後再次類是父數組和內部類數組中應該有基於分支的數組和內部的Brance考試數組和內部的考試數組中應該有學生姓名和生物的聯合數組。

所以基本上陣列應該像基於類的我不喜歡下面這是工作的罰款,但如何建立內部的

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

陣列此

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" 
       ) 
      ) 
     ) 
    ) 
); 

爲了使集團--- - - - - - - - - - - - - - - - 編輯 - - - - - - - - - - ---------------

來自下面的循環

foreach($data as $array){ 
     $grouped[$array["class"]][$array["branch"]][$array["Exam"]][]=array("student name"=>$array["student name"],"Bio"=>$array["Bio"]); 
} 

我得到預期的O/P ,但如果我需要另一個O/P這樣

預期的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"]); 
} 
+0

@mickmackusa我已經提到的應該是什麼O/P,看行嵌套數組 – webpic

+0

@mickmackusa「所以基本上陣列應該是這樣」在上面的回答。 – webpic

+0

相關:http://stackoverflow.com/questions/38366694/group-a-multidimensional-array-by-a-key-value – mickmackusa

回答

1

單循環!

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(
    [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 
      ) 
     ) 
    ) 
) 
+0

@webpic我不確定'競爭者'是否意味着'學生的名字',但只是考慮單線結構的性質。如果你想保留聯合關鍵字,在'[] ='前按順序*命名它們,然後將所有索引/嵌套數組放在'='之後。如果您需要更多信息,只需詢問(如果偏離這個問題太多了,您可能需要另外提問。無論哪種方式,我很樂意伸出援手。 – mickmackusa

+0

我編輯了這個問題看起來預期o/p – webpic

+0

多數民衆贊成brilliance tnx。預計o/p。如果我只想在分支數組中使用array('finance','IT')而不是數組([0] => finance,[1] => IT)。 – webpic

0

也許像這樣(未測試)?

$newData = []; 

foreach ($data as $row) { 
    $student = [ 
     'student name' => $row['student name'], 
     'Bio' => $row['Bio'] 
    ]; 
    $newData[$row['class']][$row['branch']][$row['exam']][] = $student; 
}