PHP CSV 到关联数组,顶行作为键,后续行作为值

PHP CSV to associative array with top row as keys and following rows as values

我刚刚开始学习 PHP 并坚持使用关联数组的概念。到目前为止我看到的所有示例都是处理 csv 文件的。我实际上将 csv 作为字符串,其中第一行充当键,所有以下行都是存储在多维数组中的值。

输入的 csv 字符串是这样的,或者我相信这是 csv 字符串的样子:

"fname,lname
 a,b
 c,d" 

输出应该是:(考虑到输入很长,不仅仅是两行)

[
   ["fname"=> "a" , "lname"=>"b"],
   ["fname"=> "c" , "lname"=>"d"]
]

因为我正在努力学习 PHP 所以这就是我到目前为止所做的:

 <?php

// original string
$OriginalString = "fname,lname,a,b,c,d,e,f";
//get each item
$SplittedString = array(explode(",",$OriginalString));
}    
?>

这里是这个问题的接近解决方案:

我想将 csv 字符串转换为 csv 文件,然后使用网上已有的正常解决方案。这应该可以完成工作,但我想看看对于这个特定的输出还有什么其他可能的解决方案。

根据你的字符串,我会

  1. 在新行上分解字符串,给出一个行数组。
  2. 用逗号分解第 1 行以获得键数组
  3. 遍历剩余的行并在逗号上展开以获得值数组

现在您可以根据数据构建最终数组。

这是错误的:

// original string
$OriginalString = "fname,lname,a,b,c,d,e,f"

你的原始字符串有 newlines 这在这里非常重要,这意味着你的 $OriginalString 应该是:

// original string
// original string
$OriginalString = "fname,lname
a,b
c,d
e,f";

从那里你可以按行分解字符串,

$lines = explode("\n",$originalString);

从那里它变得有点复杂,你可以用 foreach 迭代这些行,记住第一行给你键,一旦你解析出键,你可以用另一个迭代下一行片段explode+foreach,喜欢

$keys = array();
$parsed = array();
foreach($lines as $lineno => $line){
    if($lineno === 0){
        // the first line is special, it contains the keys
        $keys = explode(",",$line);
        continue;
    }
    $fragments = explode(",", $line);
    $current=array();
    foreach($fragments as $fragment_number => $value){
        $current[ $keys[$fragment_number] ]=$value;
    }
    $parsed [] = $current;
}

这给出了

[
    {
        "fname": "a",
        "lname": "b"
    },
    {
        "fname": "c",
        "lname": "d"
    },
    {
        "fname": "e",
        "lname": "f"
    }
]