将两行 csv 字符串(标题和值)转换为关联数组

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

我有一个如下所示的字符串:

Name,Age,Location
Jo,28,London

我如何将其转换为关联数组,使其读起来像这样:

Array
(
    [Name] => Jo
    [Age] => 28
    [Location] => London
)

我尝试过分解字符串并以这种方式操作它,但一无所获(

$body = explode(',', $body);
)我尝试使用
array_map()
,但它首先需要一个数组。

我浏览了几篇文章(PHP CSV 到带有行标题的关联数组),但他们再次使用

array_map()

php arrays csv text-parsing
4个回答
6
投票

您试图过度设计简单的事情,这会导致浪费太多时间来完成任务。

$str = "Name,Age,Location\nJo,28,London";

$lines = explode("\n", $str);
$keys = explode(',', $lines[0]);
$vals = explode(',', $lines[1]);

$result = array_combine($keys, $vals);

但即使是普通的循环也能满足你的情况,除非你有更好的想法,否则这就是你最终应该得到的结果:

$result = []; 
for($i=0; $i<count($keys); $i++) {
   $result[$keys[$i]] = $vals[$i];
}

我还建议您查看可用的内置数组函数的列表,以获得未来的好处。


1
投票

这个答案将处理多行 CSV 文件。

Array_shift 将获取第一行并将其作为键,然后循环其余行并使用 array_combine 中的键。

$str = "Name,Age,Location
Jo,28,London
Do,35,London";

$arr= explode("\n", $str);
$keys = explode(",",array_shift($arr));
foreach($arr as $line){
    $new[]= array_combine($keys, explode(",", $line));
}

var_dump($new);

https://3v4l.org/hAmCN

array(2) {
  [0]=>
  array(3) {
    ["Name"]=>
    string(2) "Jo"
    ["Age"]=>
    string(2) "28"
    ["Location"]=>
    string(6) "London"
  }
  [1]=>
  array(3) {
    ["Name"]=>
    string(2) "Do"
    ["Age"]=>
    string(2) "35"
    ["Location"]=>
    string(6) "London"
  }
}

0
投票

你试试这个代码:

$ex = explode(PHP_EOL, $string)
$arr = array_combine(explode(',',$ex[0]), explode(',',$ex[1]));
print_r($arr);die;

0
投票

试试这个,它有效:

  $content = $string;
  $delimiter = ",";
  $enclosure = '"';
  $escape = "\\" ;
  $rows = array_filter(explode(PHP_EOL, $content));
  $header = NULL;
  $data = [];

  foreach($rows as $row)
  {
    $row = str_getcsv ($row, $delimiter, $enclosure , $escape);

    if(!$header) {
      $header = $row;
    } else {
      $data[] = array_combine($header, $row);
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.