我有一个如下所示的字符串:
Name,Age,Location
Jo,28,London
我如何将其转换为关联数组,使其读起来像这样:
Array
(
[Name] => Jo
[Age] => 28
[Location] => London
)
我尝试过分解字符串并以这种方式操作它,但一无所获(
$body = explode(',', $body);
)我尝试使用array_map()
,但它首先需要一个数组。
我浏览了几篇文章(PHP CSV 到带有行标题的关联数组),但他们再次使用
array_map()
。
您试图过度设计简单的事情,这会导致浪费太多时间来完成任务。
$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];
}
我还建议您查看可用的内置数组函数的列表,以获得未来的好处。
这个答案将处理多行 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);
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"
}
}
你试试这个代码:
$ex = explode(PHP_EOL, $string)
$arr = array_combine(explode(',',$ex[0]), explode(',',$ex[1]));
print_r($arr);die;
试试这个,它有效:
$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);
}
}