Назначать объекты как переменные в многомерном массиве

#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. Это именно тот ответ, который я искал, спасибо!