我有一个带有键“key1”和另一个“key2”的关联数组:
{
id : 1,
name : "Rob",
key1 : "bla"
},
{
id : 2,
name : "Mat",
key1 : "blabla"
},
{
id : 3,
name : "Tom",
key2 : "blablabla"
}
这是我编写 csv 文件的代码:
// $csv is the array
$fp = fopen('file.csv', 'wb');
foreach ($csv as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
结果是这样的。所有信息均一致:
1,Rob,bla
2,Mat,blabla
3,Tom,blablabla
有没有办法根据它们的键将这些值写入列中?结果应该是:
id | name | key1 | key2
1 | Rob | bla |
2 | Mat | blabla |
3 | Tom | | blablabla
您可以通过保存所有表键的循环来完成此操作。然后检查每一行上的所有键,如果缺少键,请使用空字符串创建它!
$fp = fopen('file.csv', 'wb');
$savedKeys = [] ;
foreach ($csv as $getKey) {
$savedKeys = array_merge($savedKeys,array_keys($getKey)) ;
}
$savedKeys =array_unique($savedKeys) ;
foreach ($csv as $fields) {
foreach ($savedKeys AS $checkKey){
if (!isset($field[$checkKey])){
$field[$checkKey] = '';
}
}
fputcsv($fp, $fields);
}
fclose($fp);
我也需要这个,实现如下:
<?php
class DisparateRowAlignerTest extends TestCase {
public function test_aligning_disparate_rows() {
$this->assertEquals(
[
['foo', 'bar', 'baz', 'zip'],
[1, '', '', ''],
[2, 3, '', ''],
['', 5, 4, ''],
[6, '', 7, ''],
['', '', '', 8],
['', '', '', ''],
],
DisparateRowAligner::alignRows([
['foo' => 1],
['foo' => 2, 'bar' => 3],
['baz' => 4, 'bar' => 5],
['foo' => 6, 'baz' => 7],
['zip'=> 8],
[],
])
);
}
}
class DisparateRowAligner {
/**
* @param array<array<string, mixed>> $rows
*/
public static function alignRows(
array $rows,
?string $emptyFill = ''
): array {
$keys = static::getKeys($rows);
return [
$keys,
...array_map(
fn (array $oldRow) => array_map(
fn (string $key) => $oldRow[$key] ?? $emptyFill,
$keys
),
$rows
),
];
}
private static function getKeys(array $rows): array {
return array_values(
array_unique(
array_reduce(
$rows,
fn (array $keys, array $row) => array_merge($keys, array_keys($row)),
[]
)
)
);
}
}