2017-02-26 7 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 ) 
    ) 

以下のように連想多次元配列を有しています。私はアレイグループを作成する必要があることを意味します。例えばクラス要素は1年目と2年目の値が繰り返されます。それゆえ、独特の要素の配列を作り出す。クラスは親配列と内部クラス配列で、分岐ベースの配列と内部分岐型のExam配列と内部のExam配列は学生名とバイオの連想配列でなければなりません。

はとても基本的に、アレイは、クラスに基づいてグループを作成するには

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 
    } 

内の配列を作成します--- ------------------------------ EDIT ------------------- ---------------

以下のループ

私は、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を期待この

のような他のO/Pを必要とする場合、私は、次のループを試みたが、期待通りのO/Pを得ていない

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

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

@mickmackusa私はすでにP/oをどうあるべきか言及しているネストされた配列 – webpic

+0

@mickmackusaは、ラインを参照してください上記の回答で「とても基本的に、配列は次のようになります」。 – webpic

+0

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

答えて

1

ループ内の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「競争相手」が「学生名」を意味するのかどうかはわかりませんが、 1ライナーの構造の性質を考慮する。連想キーを保持したい場合は、 '* 'の前に*を*の順に付け、' = 'の後ろにすべてのインデックス/ネストされた配列を配置します。より多くの情報が必要な場合は、尋ねてください(この質問からの出発が多すぎる場合は、別の質問をする必要があります)。いずれにせよ、私は手を貸してうれしいです。 – mickmackusa

+0

私は期待された外観のo/pを編集しました – webpic

+0

thats brilliance tnx。期待されるo/p。 array([0] => finance、[1] => IT)ではなく、配列( 'finance'、 '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; 
}