str_getcsv成为php中的多维数组

时间:2011-12-02 07:45:16

标签: php csv

我有这样的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值是动态的。

3 个答案:

答案 0 :(得分:35)

假设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));
}

如果行具有可变数量的列(如示例中,最后一行有2列而不是3列),请改用此循环:

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

答案 1 :(得分:4)

以下是完整的解决方案:

$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
    • 解析行
    • 初始化空结果数组
    • 根据格式检查每一行。添加单元格,并用空字符串填充缺少的列。

答案 2 :(得分:2)

这是一个非常简洁的解决方案:

function parse_row($row) {
  return array_map('trim', explode(',', $row));
}

$rows   = str_getcsv($csv_data, "\n");
$keys   = parse_row(array_shift($rows));
$result = array();

foreach ($rows as $row) {
  $row = parse_row($row);
  $row = array_pad($row, 3, NULL);

  $result[] = array_combine($keys, $row);
}