将对象分配为多维数组中的变量

时间:2019-03-30 22:55:23

标签: php arrays

我有以下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,但在知识不足使我失望之前并没有走很远。

谢谢!

1 个答案:

答案 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'];

演示:https://3v4l.org/8foHN