PHP 将数组值插入到 csv 列

问题描述 投票:0回答:3

我有一个大的(大小 ~ 12k)二维数据数组,如下所示,我想将这些数据插入到一个 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
111 555 999
222 666 000
333 777 111
444 888 222

我知道

fputcsv
可用于插入数据,但它将数组值作为一行插入 csv 中,但在我的情况下,我想将数组值插入到 csv 列中。

有没有更简单的方法将所有数组值插入到上表中的 csv 列中?

php csv fputcsv
3个回答
1
投票

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

  • 使用 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

官方文档中,您可以找到许多其他有用的数组函数。


1
投票

由于 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;
}

0
投票

也许有这样的东西?

foreach ( array_keys( $data[array_key_first($data)] ) as &$column_key) { 
    var_dump( array_column($data,$column_key) );
}
array(3) {
  [0]=>
  int(111)
  [1]=>
  int(555)
  [2]=>
  int(999)
}
array(3) {
  [0]=>
  int(222)
  [1]=>
  int(666)
  [2]=>
  int(0)
}
...
© www.soinside.com 2019 - 2024. All rights reserved.