将数组转换为二维数组

时间:2017-05-22 19:33:37

标签: php arrays csv

我进入代码的时间越长,我就越觉得我这一切都错了。

我有一个包含一些键/值和一些嵌套数组的数组。它看起来像下面这样:

Array
(
    [key1] => valueA
    [key2] => valueB
    [key3] => valueC
    [key4] => Array
    (
        [0] => Array
            (
                [key1] => value1
                [key2] => value2
            )

        [1] => Array
            (
                [key1] => value3
                [key2] => value4
            )
    )
    [key5] => Array
    (
        [0] => Array
            (
                [key1] => value5
                [key2] => value6
            )

        [1] => Array
            (
                [key1] => value7
                [key2] => value8
            )
        [2] => Array
            (
                [key1] => value9
                [key2] => value10
            )
    )
)

我的目标是以CSV格式输出此数组(最快捷,最简单的方式)。

因此,以该格式输出此数组将如下所示:

Column 1, Column 2, Column 3, Column 4, Column 5, Column 6, Column 7
valueA, valueB, valueC, value1, value2, value5, value6
null,   null,   null,   value3, value4, value7, value8,
null,   null,   null,   null,   null,   value9, value10

我认为这样做的一种方法是通过用空值填充额外的位置,使数组成为二维(即使在技术上也是如此)。

有没有办法在PHP中快速转换该数组?或类似的?

2 个答案:

答案 0 :(得分:1)

如果我知道输入的哪些方面是静态的,那么我的方法可以写得更简单。例如,总会有7列吗?非数组总是会出现在数组之前吗?由于缺乏这方面的知识,我制定了一种应该足够灵活的方法。 ......快速而简单吗?国际海事组织,没有。

输入:

$input=[
        'key1'=>'valueA',
        'key2'=>'valueB',
        'key3'=>'valueC',
        'key4'=>[
            ['key1'=>'value1','key2'=>'value2'],
            ['key1'=>'value3','key2'=>'value4']
         ],
        'key5'=>[
            ['key1'=>'value5','key2'=>'value6'],
            ['key1'=>'value7','key2'=>'value8'],
            ['key1'=>'value9','key2'=>'value10']
         ]
       ];

方法(Demo):

$col=0;
foreach(array_values($input) as $k1=>$v1){
    if(!is_array($v1)){
        if(!isset($result[0])){$result[0]=[];}
        $result[0][$col]=$v1;
        ++$col;             // shift attention to next allowable column
    }else{
        foreach($v1 as $k2=>$v2){
            foreach(array_values($v2) as $k3=>$v3){
                if(!isset($result[$k2])){$result[$k2]=[];}
                $result[$k2][$col+$k3]=$v3;
            }
        }
        $col+=sizeof($v2);  // shift attention to next allowable column
    }
}

for($x=0,$count=sizeof($result[0]); $x<$count; ++$x){
    $colheads[]='Column '.($x+1);                             // build column headings
    foreach($result as $i=>$a){
        if(!isset($result[$i][$x])){$result[$i][$x]=null;}    // null fill
    }
}

foreach($result as &$a){
    ksort($a);                     // sort each subarray using keys (put nulls in order)
}
array_unshift($result,$colheads);  // attach column heads to the start of result array
var_export($result);

输出:

[
    ['Column 1','Column 2','Column 3','Column 4','Column 5','Column 6','Column 7'],
    ['valueA','valueB','valueC','value1','value2','value5','value6'],
    [NULL,NULL,NULL,'value3','value4','value7','value8'],
    [NULL,NULL,NULL,NULL,NULL,'value9','value10']
]

答案 1 :(得分:0)

试试这个:

<?php
for($i=1;$i<=3;$i++){

    if($i==3){
        $separator=';'.PHP_EOL;
    }else{ 
        $separator=',';
    }
    $tab[]=$array["key$i"].$separator;
}
for($i=1;$i<=2;$i++){
    if($i==2){
        $separator=';'.PHP_EOL;
    }else{ 
        $separator=',';
    }
    $tab2[]=$array["key4"][0]["key$i"].$separator;
}

for($i=1;$i<=2;$i++){
    if($i==2){
        $separator=';'.PHP_EOL;
    }else{ 
        $separator=',';
    }
    $tab3[]=$array["key4"][1]["key$i"].$separator;
}

 for($i=1;$i<=2;$i++){
     if($i==2){
        $separator=';'.PHP_EOL;
    }else{ 
        $separator=',';
    }
    $tab4[]=$array["key5"][0]["key$i"].$separator;
}
 for($i=1;$i<=2;$i++){

      if($i==2){
        $separator=';'.PHP_EOL;
    }else{ 
        $separator=',';
    }

    $tab5[]=$array["key5"][1]["key$i"].$separator;
}
 for($i=1;$i<=2;$i++){

      if($i==2){
        $separator=';'.PHP_EOL;
    }else{ 
        $separator=',';
    }

    $tab6[]=$array["key5"][2]["key$i"].$separator;
}


$handle = fopen('blapaz.csv','w');



foreach($tab as $output) { 

    fwrite($handle,$output);
}

foreach($tab2 as $output) { 

    fwrite($handle,$output);
}
foreach($tab3 as $output) { 
      fwrite($handle,$output);

}
foreach($tab4 as $output) { 

    fwrite($handle,$output);
}
foreach($tab5 as $output) { 

    fwrite($handle,$output);
}

foreach($tab6 as $output) { 

    fwrite($handle,$output);
}


?>

您希望从数组更改为多维,无论是从多维到字符串?

$array = array(

'key1' => 'valueA',
'key2' => 'valueB',
'key3' => 'valueC',
'key4' => 
[0=>    [
        'key1'=>'value1',
        'key2'=>'value2',
        ],
        ['key1'=>'value3',
        'key2'=>'value4',
        ]       
],
'key5' => [
            0 => [
            'key1'=>'value5',
            'key2'=>'value6',
            ],
            1 => [
            'key1'=>'value7',
            'key2'=>'value8',
            ],
            2 => [
            'key1'=>'value9',
            'key2'=>'value10',
            ],


]

);

此??

$handle = fopen('blapaz.csv','w');

for($i=1;$i<=3;$i++){


     $tab[]=$array["key$i"].',';

}




for($i=1;$i<=2;$i++){

    $tab2[]=$array["key4"][0]["key$i"].',' ;
}

for($i=1;$i<=2;$i++){

    $tab3[]=$array["key4"][1]["key$i"].',' ;
}

 for($i=1;$i<=2;$i++){

    $tab4[]=$array["key5"][0]["key$i"].',' ;
}
 for($i=1;$i<=2;$i++){



    $tab5[]=$array["key5"][1]["key$i"].',' ;
}
 for($i=1;$i<=2;$i++){


    $tab6[]=$array["key5"][2]["key$i"].',' ;
}



 $zmienna[] =  $tab[0].$tab[1].$tab[2].$tab2[0].$tab2[1].$tab4[0].$tab4[1].PHP_EOL.
 ','.','.','.$tab3[0].$tab3[1].$tab5[0].$tab5[1].PHP_EOL.
 ','.','.','.','.','.$tab6[0].$tab6[1];

 fputcsv($handle,$zmienna);
//print_r(str_getcsv($zmienna));

$handle = fopen('blapaz.csv','r');
print_r(  fgetcsv($handle));

?>