#php #arrays
#php #массивы
Вопрос:
У меня есть следующий json, который отправляет данные в мой скрипт:-
{
"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'];
Это работает нормально. Я могу напечатать_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'];
}
Как вы можете заметить, это быстро выходит из-под контроля и, вероятно, где-нибудь закончится.
Поскольку значение ‘type’ всегда будет правильным в данном случае (motorised: автомобили, motorised: фургоны, motorised: велосипеды), то это должен быть просто случай получения объекта ‘data’ из этого ключа ‘type’.
Есть ли лучший — по крайней мере, правильный — способ сделать это? Я пытался использовать foreach, но не продвинулся далеко, прежде чем недостаток знаний подвел меня.
Спасибо!
Ответ №1:
Вы можете создать карту, проиндексированную 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'];
Демонстрация: https://3v4l.org/8foHN
Комментарии:
1. Это именно тот ответ, который я искал, спасибо!