我有以下json,这是我的脚本的POST数据:-
{
"type":"vehicles:motorised",
"data":[
{
"type":"motorised:cars",
"data":{
"make":"Audi",
"model":"A4"
}
},
{
"type":"motorised:vans",
"data":{
"make":"Ford",
"model":"Transit"
}
},
{
"type":"motorised:bikes",
"data":{
"make":"Honda",
"model":"Fireblade"
}
}
]
}
在php中,我只是在执行以下操作以获取此数据并将其转换为php数组。
$jsonContent = file_get_contents("php://input");
$jsonData = json_decode($jsonContent, true);
如果我var_dump($ jsonData),此方法可以提供以下内容:-
array(2) {
["type"]=>
string(18) "vehicles:motorised"
["data"]=>
array(3) {
[0]=>
array(2) {
["type"]=>
string(14) "motorised:cars"
["data"]=>
array(2) {
["make"]=>
string(4) "Audi"
["model"]=>
string(2) "A4"
}
}
[1]=>
array(2) {
["type"]=>
string(14) "motorised:vans"
["data"]=>
array(2) {
["make"]=>
string(4) "Ford"
["model"]=>
string(7) "Transit"
}
}
[2]=>
array(2) {
["type"]=>
string(15) "motorised:bikes"
["data"]=>
array(2) {
["make"]=>
string(5) "Honda"
["model"]=>
string(9) "Fireblade"
}
}
}
}
我认为我可以使用以下方法为每种“类型”的机动车辆创建一个对象,如下所示:-
$cars = $jsonData['data'][0]['data'];
$vans = $jsonData['data'][1]['data'];
$bikes = $jsonData['data'][2]['data'];
这很好。我可以print_r($ cars)并完美地获得cars数组。但是,使用0、1和2会造成混淆,如果由于某种原因,我的json处于不同顺序,则会崩溃。因此,例如'1'可能持有自行车,'2'可能持有汽车,等等。喜欢用这种更好的方法,例如:-
if ($jsonData['data'][0]['type'] == "motorised:cars") {
$cars = $jsonData['data'][0]['data'];
} elseif ($jsonData['data'][1]['type'] == "motorised:cars") {
$cars = $jsonData['data'][1]['data'];
} elseif ($jsonData['data'][2]['type'] == "motorised:cars") {
$cars = $jsonData['data'][2]['data'];
}
如您所知,这很快就失控了,可能会落在某个地方。
由于在这种情况下,“类型”值始终是正确的(motorized:cars,motorized:vans,motorised:bikes),因此应该只是从该“ type”键获取对象“ data”的情况。 / p>
是否有更好(至少正确)的方法?我曾尝试过使用foreach,但在知识不足使我失望之前并没有走很远。
谢谢!
答案 0 :(得分:0)
您可以构建以type
索引的地图。这可以通过简单的循环或array_reduce
来完成:
$map = array_reduce($jsonData['data'], function ($map, $entry) {
$map[$entry['type']] = $entry['data'];
return $map;
}, []);
然后像这样简单地使用它:
$cars = $map['motorised:cars'];
$vans = $map['motorised:vans'];
$bikes = $map['motorised:bikes'];