在php如何将str_getcsv变成一个多维数组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (106)

我有这样的CSV值:

$csv_data = "test,this,thing
             hi,there,this
             is,cool,dude
             have,fun";

我希望获取整个CSV字符串,并将其读入多维数组,以便获得:

array(
   array(
      'test' => 'hi',
      'this' => 'there',
      'thing' => 'this'
   ),
   array(
      'test' => 'is',
      'this' => 'cool',
      'thing' => 'dude'
   ),
   array(
      'test' => 'have',
      'this' => 'fun',
      'thing' => ''
   )
);

我想要这样的输出,请注意CSV值是动态的。

提问于
用户回答回答于

假设CSV数据中的每一行都有相同数量的列,这应该可以执行。

$lines = explode("\n", $csv_data);
$head = str_getcsv(array_shift($lines));

$array = array();
foreach ($lines as $line) {
    $array[] = array_combine($head, str_getcsv($line));
}

如果行有可变的列数,则使用此循环:

foreach ($lines as $line) {
    $row = array_pad(str_getcsv($line), count($head), '');
    $array[] = array_combine($head, $row);
}
用户回答回答于

这是一个完整的解决方案:

$lines = explode("\n", $csv_data);
$formatting = explode(",", $lines[0]);
unset($lines[0]);
$results = array();
foreach ( $lines as $line ) {
   $parsedLine = str_getcsv( $line, ',' );
   $result = array();
   foreach ( $formatting as $index => $caption ) {
      if(isset($parsedLine[$index])) {
         $result[$formatting[$index]] = trim($parsedLine[$index]);
      } else {
         $result[$formatting[$index]] = '';
      }
   }
   $results[] = $result;
}

那么这这代码有什么用?

  • 首先,你的CSV数据被分成几行 explode
  • 由于CSV中的第一行描述了数据格式,所以它必须与实际的数据行(explodeunset)分开,
  • 为了存储结果,我们初始化一个新的数组($results
  • Foreach用来逐行遍历数据。对于每一行:
    • 行是用PHP的解析 str_getcsv
    • 一个空的结果数组被初始化
    • 每行都根据格式进行检查。单元格被添加,缺少的列填充空字符串。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励