我进入代码的时间越长,我就越觉得我这一切都错了。
我有一个包含一些键/值和一些嵌套数组的数组。它看起来像下面这样:
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 :(得分: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));
?>