繁体   English   中英

关联索引数组到关联关联数组

[英]Associative index array to associative associative array

问题

我有一个数组,它通过以下方式从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
                )
        )
)

数组名称(电影,游戏)取自工作表名称,因此数量可以变化。 第一个子数组将始终包含键名,例如Films [0]和Games [0],它们的数量可以是可变的。 我(认为我)知道我需要做下面的事情,但我很茫然。

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

我在这里进行了广泛的搜索,如果没有重复,我会删除它。

感谢您的输入

尝试

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

}

在此处查看演示

您可以使用嵌套的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
);

演示版

我认为这可以做到:

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

编辑:测试并更新了代码,工作...

这样的事情应该起作用:

$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

可能答案有点晚,但看起来更像是您尝试过的解决方案

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM