2014-03-07 118 views
1

問題關聯索引陣列到關聯關聯數組

我有從PHPExcel通過以下

<?php 
    require_once 'PHPExcel/Classes/PHPExcel/IOFactory.php'; 
    $excelFile = "excel/1240.xlsx"; 
    $objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
    $objPHPExcel = $objReader->load($excelFile); 
    foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { 
    $arrayData[$worksheet->getTitle()] = $worksheet->toArray(); 
    }   
    print_r($arrayData); 
?> 

這將返回返回的數組:

Array 
    (
     [Films] => Array 
      (
       [0] => Array 
        (
         [0] => Name 
         [1] => Rating 
        )  
       [1] => Array 
        (
         [0] => Shawshank Redemption 
         [1] => 39 
        )  
       [2] => Array 
        (
         [0] => A Clockwork Orange 
         [1] => 39 
        )  
      )  

    [Games] => Array 
     (
      [0] => Array 
       (
        [0] => Name 
        [1] => Rating 
       )  
      [1] => Array 
       (
        [0] => F.E.A.R 
        [1] => 4 
       )  
      [2] => Array 
       (
        [0] => World of Warcraft 
        [1] => 6 
       )  
     )  
) 

我想什麼要有

Array 
(
    [Films] => Array 
     (
      [0] => Array 
       (
        [Name] => Shawshank Redemption 
        [Rating] => 39 
       ) 
      [1] => Array 
       (
        [Name] => A Clockwork Orange 
        [Rating] => 39 
       ) 
     ) 

    [Games] => Array 
     (
      [0] => Array 
       (
        [Name] => F.E.A.R 
        [Rating] => 4 
       ) 
      [1] => Array 
       (
        [Name] => World of Warcraft 
        [Rating] => 6 
       ) 
     ) 
) 

數組名稱(電影,遊戲)取自表格名稱,因此金額可以變化。第一個子陣列將總是包含密鑰名稱,例如電影[0]和遊戲[0],其數量可以變化。我(想我)知道我需要做下面的事情,但我很茫然。

foreach ($arrayData as $value) { 
    foreach ($value as $rowKey => $rowValue) { 
     for ($i=0; $i <count($value) ; $i++) { 
      # code to add NAME[n] as keys 
     } 
    } 
} 

我已經在這裏進行了大量搜索,如果是重複的,我會將其刪除。

感謝任何輸入

回答

3

嘗試

$result= array(); 
foreach($arr as $key=>$value){ 
    $keys = array_slice($value,0,1); 
    $values = array_slice($value,1); 
    foreach($values as $val){ 
    $result[$key][] = array_combine($keys[0],$val); 
    } 

} 

觀看演示here

+0

接受此,因爲它是第一個工作的答案,我可以理解。 – Pwner

1

我認爲這會做:

foreach($arrayData as $key => $array){ 
    for($i=0; $i<count($array[0]); $i++){ 
     $indexes[$i]=$array[0][$i]; 
    } 
    for($i=1; $i<count($array); $i++){ 
     for($j=0; $j<count($array[$i]); $j++){ 
      $temp_array[$indexes[$j]]=$array[$i][$j]; 
     } 
     $new_array[$key][]=$temp_array; 
    } 
} 
print_r($new_array); 

編輯:測試和更新代碼,工作...

+0

對於給定的例子來說效果不錯,但似乎在鍵數或鍵數增加時重複第一個數組,例如[Films] => Array([0] => Array([Name] => Shawshank Redemption [Rating] => 99)[1] => Array([Name] => A Clockwork Orange [Rating] => 99)[2] => Array([Name] => Shawshank Redemption [Rating] => 39)[3] => Array([Name] => A Clockwork Orange [Rating] => 27)) – Pwner

1

像這樣的東西應該工作:

$newArray = array(); 
foreach ($arrayData as $section => $list) { 
    $newArray[$section] = array(); 
    $count = count($list); 
    for ($x = 1; $x < $count; $x++) { 
     $newArray[$section][] = array_combine($list[0], $list[$x]); 
    } 
} 
unset($arrayData, $section, $x); 

演示:http://ideone.com/ZmnFMM

2

您可以使用嵌套的array_map調用。不知怎的,像這樣:

$result = array_map(
    function ($subarr) { 
     $names = array_shift($subarr); 
     return array_map(
      function ($el) use ($names) { 
       return array_combine($names, $el); 
      }, 
      $subarr 
     ); 
    }, 
    $array 
); 

Demo

+0

+1喜歡這個解決方案。 –

1

可能有點晚了答案,但它看起來更像你試圖解決

     //Films,Games // Row Data 
foreach ($arrayData as $type => $value) 
{ 
    $key1 = $value[0][0]; // Get the Name Key 
    $key2 = $value[0][1]; // Get the Rating Key 

    $count = count($value) - 1; 

    for ($i = 0; $i < $count; $i++) 
    { 
     /* Get the values from the i+1 row and put it in the ith row, with a set key */ 
     $arrayData[$type][$i] = array(
      $key1 => $value[$i + 1][0], 
      $key2 => $value[$i + 1][1], 
     ); 
    } 

    unset($arrayData[$type][$count]);  // Unset the last row since this will be repeated data 
}