PHP插入数组值到csv列[重复]

neekobn8  于 2023-04-09  发布在  PHP
关注(0)|答案(3)|浏览(115)

此问题已在此处有答案

Convert associative array of indexed arrays into multi-line csv text(5个答案)
昨天关门了。
我有一个大的(大小~ 12 k)2D数据数组,如下所示,我想将这些数据插入csv文件。

$data = array
(
    'a' => array
    (
        0 => 111,
        1 => 222,
        2 => 333,
        3 => 444,
    ),
    'b' => array
    (
        0 => 555,
        1 => 666,
        2 => 777,
        3 => 888,
    ),
    'c' => array
    (
        0 => 999,
        1 => 000,
        2 => 111,
        3 => 222,
    ),
);

这里'a','b'和'c'将是CSV标题行,并且应该像下面这样插入相应的数组值:
| a|B|c|
| --------------|--------------|--------------|
| 一一一|五五五|九九九|
| 二百二十二|六六六|千|
| 三百三十三|七七七|一一一|
| 四四四|八八八|二百二十二|
我知道fputcsv可以用来插入数据,但它将数组值作为一行插入到csv中,但在我的情况下,我想将数组值插入到csv列中。
有没有更简单的方法来插入所有的数组值到csv列,如上表?

pb3s4cty

pb3s4cty1#

有一个array_column函数可能会有帮助:

$out = fopen('php://stdout', 'w');

# output the CSV header
fputcsv($out, array_keys($data));

# output the CSV records
foreach ( array_keys( $data[ array_key_first($data) ] ) as $column_key) {
     fputcsv($out, array_column($data, $column_key));
}

输出:

a,b,c
111,555,999
222,666,0
333,777,111
444,888,222
voase2hg

voase2hg2#

假设每个子数组包含相同的值计数,您只需几行代码即可实现目标:

  • 使用array_keys从数组中获取所有列名
  • 迭代每个子数组以组成单个行,假设该行的每个值位于相同的数组索引位置
$data = array
(
    'a' => array
    (
        0 => 111,
        1 => 222,
        2 => 333,
        3 => 444,
    ),
    'b' => array
    (
        0 => 555,
        1 => 666,
        2 => 777,
        3 => 888,
    ),
    'c' => array
    (
        0 => 999,
        1 => 000,
        2 => 111,
        3 => 222,
    ),
);
    
$fp = fopen('file.csv', 'w');

// headers
fputcsv($fp, array_keys($data));

// rows contents
for($i = 0; $i<count(current($data)); $i++) {
    $row = [];
    foreach($data as $k => $v) {
        $row[] = $v[$i];
    }
    fputcsv($fp, $row);
}
    
fclose($fp);

https://onlinephp.io/c/735bc上在线尝试,结果如下:

a,b,c
111,555,999
222,666,0
333,777,111
444,888,222

official documentation中,您可以找到许多其他有用的数组函数。

a9wyjsp7

a9wyjsp73#

由于CSV文件基本上是逐行写入的,因此您需要:

  • 确定要生成多少行
  • 循环那么多次,为每列选择一项

假设你所有的子数组都有相同数量的键,你可以这样设置:

$lastRowNumber = array_key_last($data['a']);
$columns = array_keys($data);

然后你的循环看起来像这样:

for ( $rowNumber = 0; $rowNumber <= $lastRowNumber; $rowNumber++ ) {
    $csvRow = [];
    foreach ( $columns as $columnKey ) {
        $csvRow[] = $data[$columnKey][$rowNumber];
    }
    fputcsv($outputFileHandle, $csvRow);
}

回显数据而不是使用fputcsv写入的演示:https://3v4l.org/P5rtU
或者,你可以使用一个行键列表来循环,而不是假设它们是按顺序编号的。例如,从第一个子数组中获取键:

$columnKeys = array_keys($data);
$rowKeys = array_keys($data[$columnKeys[0]]);

然后使用foreach代替for

foreach ( $rowKeys as $rowKey ) {
    $csvRow = [];
    foreach ( $columnKeys as $columnKey ) {
        $csvRow[] = $data[$columnKey][$rowKey];
    }
    echo implode(',', $csvRow), PHP_EOL;
}

相关问题