2014-03-07 120 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 
}