2017-03-02 183 views
0

的陣列我有2個表中, 「首部」 和 「馬赫」:創建循環

頭:

STATO |ID |CAMPIONATO 
Italy |5 |Serie A 
Spain |1 |Primera Division 
France|2 |Coppe de France 

馬赫:

STATO |home  |away  |scoreH|scoreA| 
Italy |juve  |Milan |0  |0  | 
Italy |Lazio |Roma  |0  |1  | 
Spain |Deportivo|Bilbao |1  |0  | 
Spain |A Madrid |Sevilla |1  |2  | 
France|Lille |Perigord |0  |0  | 

我使用下面的PHP代碼,以提取數據。我應該創建一個包含標題中的陣列和小組賽

$num=0; 
$mach=-1; 
foreach($first as $row2){ // cycling once 

      foreach($header as $row){ // cycles x times 

        ....  //Here recover the header data 
        $stato; 
        $id; 
        $campionato 



         for($i=0;$i<$count;++$i){ // in $count know how many times I have to do the cycle for each header (stato) 
         $mach=$mach+1; 
          ....   // Here recover the mach data 
          $home; 
          $away; 
          $scoreH; 
          $scoreA; 

         $info[$mach]= array('home'=>$home,'away'=>$away,'scoreH'=>$scoreH,'scoreA'=>$scoreA); 
         $groups[$num]=array($info[$mach]); 
         }//end for cycles 

         $headerArray[$num]=array('header'=>['stato'=>$stato,'id'=>$id,'campionato'=>$campionato],'mach'=>$groups[$um]); 
      $num++; 
      } //end header cycles 

         $blockArray[]=array('incontri'=>$headerArray); 

} //end first cycle 
         print_r($blockArray); 

的問題是,它返回所有日期匹配$組(意大利,西班牙,法國)沒有隻向組頭的。 如果您使用此行的PHP代碼:每個標題

$Groups[$num] = array($info[$mach]); 

,而不是隻返回最後一場比賽(週期):

array_push ($groups,$info[$mach]); 

代替。

我想創建數組

['incontri'=> 
[ 
header=> 
    ['stato'=>Italy,'id'=>5,'campionato'=>Serie A], 

mach=> 
    ['home'=>Juve,'away'=>Milan,'scoreH'=>0,'scoreA'=>0], 
    ['home'=>Lazio,'away'=>Roma,'scoreH'=>0,'scoreA'=>0] 

], 
[....], 
] 

我在做什麼錯?

回答

0

我不能在你的代碼上得到任何心理上的牽引,所以我自己重寫了它。 如果我理解你的目標,我已經制定了一個更精簡,更清潔的過程來生成你想要的多維數組。

*需要注意以下幾點:

  1. 不要打擾聲明變量,如果他們將只能使用一次;除非它在很大程度上提高了可讀性。
  2. 在foreach循環中使用可用的數組索引,而不是創建其他增量變量。
  3. $adeguata_mach_keys搜索$mach中的所有行,查找與header STATO值相匹配的STATO值,並返回密鑰。

這裏是我與成功測試的代碼:

$first=array(); // only cycles once, so don't bother looping it, just call it by key (I am assuming 0, but that may be wrong) 
$first[0]=array(
    array("STATO"=>"Italy","ID"=>5,"CAMPIONATO"=>"Serie A"), 
    array("STATO"=>"Spain","ID"=>1,"CAMPIONATO"=>"Primera Division"), 
    array("STATO"=>"France","ID"=>1,"CAMPIONATO"=>"Coppe de France") 
); 
$mach=array(
    array("STATO"=>"Italy","home"=>"juve","away"=>"Milan","scoreH"=>"0","scoreA"=>"0"), 
    array("STATO"=>"Italy","home"=>"Lazio","away"=>"Roma","scoreH"=>"0","scoreA"=>"1"), 
    array("STATO"=>"Spain","home"=>"Deportivo","away"=>"Bilbao","scoreH"=>"1","scoreA"=>"0"), 
    array("STATO"=>"Spain","home"=>"A Madrid","away"=>"Sevilla","scoreH"=>"1","scoreA"=>"2"), 
    array("STATO"=>"Spain","home"=>"Lille","away"=>"Perigord","scoreH"=>"0","scoreA"=>"0") 
); 

foreach($first[0] as $header_index=>$header_row){ 
    foreach($header_row as $header_row_key=>$header_row_val){ 
     $result[$header_index]["header"][$header_row_key]=$header_row_val; 
     // identify which mach rows hold matching STATO values 
     $adeguata_mach_keys=array_keys(array_intersect(array_column($mach,"STATO"),array($header_row["STATO"]))); 
     foreach($adeguata_mach_keys as $mach_index=>$mach_key){ 
      foreach($mach[$mach_key] as $mach_row_key=>$mach_row_val){ 
       $result[$header_index]["mach"][$mach_index][$mach_row_key]=$mach_row_val; 
      } 
     } 
    } 
} 
$result=array("incontri"=>$result); // I wouldn't do this, but if it is necessary for your case, fine. 
print_r($result); 

這是結果(沒有意外的子陣列覆蓋):

array (
    'incontri' => array (
     0 => array (
      'header' => array (
       'STATO' => 'Italy', 
       'ID' => 5, 
       'CAMPIONATO' => 'Serie A', 
      ), 
      'mach' => array (
       0 => array (
        'STATO' => 'Italy', 
        'home' => 'juve', 
        'away' => 'Milan', 
        'scoreH' => '0', 
        'scoreA' => '0', 
       ), 
       1 => array (
        'STATO' => 'Italy', 
        'home' => 'Lazio', 
        'away' => 'Roma', 
        'scoreH' => '0', 
        'scoreA' => '1', 
       ), 
      ), 
     ), 
     1 => array (
      'header' => array (
       'STATO' => 'Spain', 
       'ID' => 1, 
       'CAMPIONATO' => 'Primera Division', 
      ), 
      'mach' => array (
       0 => array (
        'STATO' => 'Spain', 
        'home' => 'Deportivo', 
        'away' => 'Bilbao', 
        'scoreH' => '1', 
        'scoreA' => '0', 
       ), 
       1 => array (
        'STATO' => 'Spain', 
        'home' => 'A Madrid', 
        'away' => 'Sevilla', 
        'scoreH' => '1', 
        'scoreA' => '2', 
       ), 
      ), 
     ), 
     2 => array (
      'header' => array (
       'STATO' => 'France', 
       'ID' => 1, 
       'CAMPIONATO' => 'Coppe de France', 
      ), 
      'mach' => array (
       0 => array (
        'STATO' => 'France', 
        'home' => 'Lille', 
        'away' => 'Perigord', 
        'scoreH' => '0', 
        'scoreA' => '0', 
       ), 
      ), 
     ), 
    ), 
)