2017-05-22 257 views
1

我在代碼中得到的越多,越覺得我對這一切都是錯誤的。將一個數組轉換爲二維

我有一些鍵/值和一些嵌套數組的數組也。它看起來像下面:

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中快速轉換該數組?或類似?

+0

爲什麼不遍歷,並檢查當前值是否是一個數組或字符串? php有一個內建的'is_array()'函數。基本上循環,如果它的數組爲該值做另一個循環,如果它不是,那麼只需將該值輸出到適當的格式。有了這樣的說法,你很難理解你的例子中的任意值是怎麼回事。 – GrumpyCrouton

+0

數組長度(列數)是否是靜態的?或者鍵4有3行而不是2?如果它們不是靜態的,那麼你需要一種不同的方法。看起來你正試圖將一個多維數組轉換成二維數組 - 這對於可變數據行來說並不容易。如果它是靜態的,那麼你提出的方法應該工作。 – Wes

+0

@韋斯特很可能是靜態的。他說如果這個值不存在,他會插入「null」。 – GrumpyCrouton

回答

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'] 
] 
+0

看起來這將是一個很好的解決方案。但是它們不會是靜態的。但很可能永遠不會超過一定數量的行。那麼基本上用10行null填充輸出是不是一個好主意,然後擦除沒有被其他東西填充的東西?這將使我的輸出在某種意義上是「靜態的」 – blapaz

+0

@blapaz你有另一個示例輸入,我的答案失敗了嗎?我很樂意調整任何不太正確的事情。 – mickmackusa

+0

我最終做了這個有點不同,但遵循你的代碼的想法。謝謝! – blapaz

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


?> 

你想從數組多維變化,無論從multidemnsional字符串?

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

?> 
相關問題