PHP:根据键将关联数组的值写入 CSV 文件的列中

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

我有一个带有键“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
php csv
2个回答
2
投票

您可以通过保存所有表键的循环来完成此操作。然后检查每一行上的所有键,如果缺少键,请使用空字符串创建它!

$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);

0
投票

我也需要这个,实现如下:

<?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)),
          []
        )
      )
    );
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.