将JSON数据从多个嵌套数组转换为PHP变量

时间:2018-10-10 12:10:28

标签: php arrays json

我在数组中有一个JSON数组:

{
 layouts: [
    {
      w: 6,
      h: 4,
      x: 0,
      y: 0,
      i: "n0",
      minW: 1.5,
      minH: 1,
      maxH: 1000,
      moved: false,
      static: false,
      widget: "Clock"
    },
    {
      w: 2,
      h: 2,
      x: 0,
      y: 4,
      i: "n1",
      minW: 1,
      minH: 1,
      maxH: 1000,
      moved: false,
      static: false,
      widget: "Weather"
     }
  ]
}

我需要将每个小部件布局存储在数据库中。当我尝试执行查询时,它返回一个错误,即值是空的。我尝试了here中的一些示例,但它们对我不起作用。

功能:

public function store(Request $request)
{

    $JSON = json_decode($request);

    foreach (array($JSON) as $data) {

        $i = 0;

        $w = $data[$i]['w'];
        $h = $data[$i]['h'];
        $x = $data[$i]['x'];
        $y = $data[$i]['y'];
        $i = $data[$i]['i'];
        $minW = $data[$i]['minW'];
        $minH = $data[$i]['minH'];
        $maxH = $data[$i]['maxH'];
        $moved = $data[$i]['moved'];
        $static = $data[$i]['static'];
        $type = $data[$i]['type'];

        DB::table('widgets')->insert(
            ['w' => $w,
             'h' => $h,
             'x' => $x,
             'y' => $y,
             'i' => $i,
             'minW' => $minW,
             'minH' => $minH,
             'maxH' => $maxH,
             'moved' => $moved,
             'static' => $static,
             'type_widget' => $type]
        );

        $i++;

    }

    return response()->json(201);
}

谁能告诉我在数据中循环保存的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

您需要使用json_decode($array, true)的第二个参数(true)表示需要将输入字符串转换为关联数组,以正确解析JSON。

您还可以使用Request直接从$request->all()提取JSON。我建议使用这种方法,因为它要容易得多,并且始终可以正确解析数组。解码Request对象可能会导致数组格式与原始提交的数组格式不同(除了数据之外,还包含Request对象本身的数据)。

答案 1 :(得分:1)

当Sven Hakvoorts回答成功时,这是foreach的简化版本

$i = 0;
$data = json_decode($request, true);
while (isset($data['layouts'][$i])) {
    DB::table('widgets')->insert($data['layouts'][$i]);
    $i++;
}

更短(也是最好的方法):

foreach ($data['layouts'] as $row) {
    DB::table('widgets')->insert($row);
}

我认为您只需重命名一列即可使此短代码起作用:type_widget进行键入,这样您的字段和列名相等,这将导致代码缩短很多。

答案 2 :(得分:0)

1。

$JSON = json_decode($request);

将其更改为

$JSON = json_decode($request,true);

2。  从foreach循环中删除$ i = 0并将其放置在befor foreach循环中