我有一个大的(大小 ~ 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 列中?
假设每个子数组包含相同数量的值,只需几行代码即可实现您的目标:
$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
在官方文档中,您可以找到许多其他有用的数组函数。
由于 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;
}
也许有这样的东西?
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)
}
...