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 行以获得键数组
- 遍历剩余的行并在逗号上展开以获得值数组
现在您可以根据数据构建最终数组。
这是错误的:
// 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"
}
]
我刚刚开始学习 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 行以获得键数组
- 遍历剩余的行并在逗号上展开以获得值数组
现在您可以根据数据构建最终数组。
这是错误的:
// 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"
}
]