我正在使用CSV数据并使用PHP生成JSON,但我想知道是否有可能从CSV中获取某些行以在对象内创建数组,请参见下面的目标:
我有以下示例CSV数据:
songId, title, artists:name[1], artists:main[1], artists:name[2], artists:main[2]
"trk-01", "Track 1", "artist 1", "true", "artist 2", "false"
"trk-02", "Track 2", "artist 3", "true", "artist 4", "false"
(可以根据解决方案进行格式化)
下面的PHP被用来从上面的CSV创建JSON:
if (($handle = fopen('example.csv', 'r')) === false) {
die('Error opening file');
}
$headers = fgetcsv($handle, 1024, ',');
$complete = array();
while ($row = fgetcsv($handle, 1024, ',')) {
$complete[] = array_combine($headers, $row);
}
$completeobj = array("tracks" => $complete);
$result = array_merge($completeobj);
fclose($handle);
echo json_encode($result, JSON_PRETTY_PRINT);
$fp = fopen('results.json', 'w');
fwrite($fp, json_encode($result, JSON_PRETTY_PRINT));
fclose($fp);
生成的JSON如下:
{
"tracks": [
{
"songId": "trk-01",
"title": "Track 1",
"artists:name[1]": "artist 1",
"artists:main[1]": "true",
"artists:name[2]": "artist 2",
"artists:main[2]": "false"
},
{
"songId": "trk-02",
"title": "Track 2",
"artists:name[1]": "artist 3",
"artists:main[1]": "true",
"artists:name[2]": "artist 4",
"artists:main[2]": "false"
}
]
}
但是我的目标是在CSV中获取那些'artists'行,并将它们的值放入对象artists中的数组中,参见下面的desired json:
{
"tracks": [
{
"songId": "trk-01",
"title": "track 1",
"artists":
[
{
"name": "Artist 1",
"main": true
},
{
"name": "Artist 2",
"main": false
}
]
},
{
"songId": "trk-02",
"title": "track 2",
"artists":
[
{
"name": "Artist 3",
"main": true
},
{
"name": "Artist 4",
"main": false
}
]
}
]
}
如果有人可以建议实现这一点的方法或向我展示一个例子,可以帮助我弄清楚,这将是王牌!
在json_encode
之前试试这个$new_result = array();
foreach($result['tracks'] as $trackdata){
$id = $trackdata['songId'];
$title = $trackdata['title'];
$name1 = $trackdata['artists:name[1]'];
$name2 = $trackdata['artists:name[2]'];
$main1 = $trackdata['artists:main[1]'];
$main2 = $trackdata['artists:main[2]'];
$new_result['tracks'][]=array(
'songID' => $id,
'title' => $title,
'artists' => array(
0 => array(
'name' => $name1,
'main' => $main1,
),
1 => array(
'name' => $name2,
'main' => $main2,
),
),
);
}