用PHP创建嵌套的JSON

时间:2019-06-16 23:47:19

标签: php json

如何将通过邮寄发送的数据转换为php代码? 我有3个选择字段。大人,小孩,婴儿。 我想在发布时根据房间数创建以下json结构。儿童和婴儿的数量按地区划分不正确。我该怎么办?

foreach ($this->input->post('adult') as $key => $value) {
    $rooms[] = array(
        'adult' => $_POST['adult'][$key],
        'child' => array(
            'child_total' => $_POST['child'][$key],
            'child_date' => $_POST['child_date']
        ),
        'baby' => array(
            'baby_total' => $_POST['baby'][$key],
            'baby_date' => null
        )
    );
}

我想要这个json ...

rooms: [
         {
            adult: 2,
            child: [
               child_total: 1
               child_date: [
                   "2017-08-10"
               ],
            ],
            baby: [
               baby_total: 1
               baby_date: [
                   "2017-07-01"
               ],
            ],
         },
         {
            adult: 1,
            child: [
               child_total: 2
               child_date: [
                   "2017-08-08",
                   "2017-08-09"
               ],
            ],
            baby: [
               baby_total: 2
               baby_date: [
                   "2017-06-08",
                   "2017-05-09"
               ],
            ],
         }
      ],

2 个答案:

答案 0 :(得分:1)

要弄清楚使您成为json编码的字符串所需的数据结构,让我们首先定义要使用的对象。假设这类似于酒店预订系统,让我们对其进行映射:

旅馆有房间。它们由房间号标识。可以用$room[$room_number]在代码中进行说明。使用房间号作为键,可以唯一地标识特定的房间。

每个房间可容纳人员:成人,儿童和婴儿。可以通过以下代码在代码中加以说明

$room[$room_number]['adults']
$room[$room_number]['children']
$room[$room_number]['babies']

这组婴儿可以显示为$baby[]。我们真的不需要用索引号以外的唯一标识符来识别婴儿。我们只是对列表感兴趣。

因此,我们将['babies']替换为['baby'][]

$room[$room_number]['adults']
$room[$room_number]['children']
$room[$room_number]['baby'][]

每个婴儿都有属性。我们只使用一个,但是为了举例说明,我们要记录两个:生日和名字。换句话说,每个$baby = array('birthday'=>$birthdate, 'name'=>$name);

这很难说明,因为在将其分配给$room[$room_number]['baby'][]之前,您必须收集所有婴儿信息。所以我将使用索引号显示它:

$room[$room_number]['adults']
$room[$room_number]['children']
$room[$room_number]['baby'][0]['birthdate']
$room[$room_number]['baby'][0]['name']

孩子需要相同的功能:

$room[$room_number]['adults']
$room[$room_number]['children'][0]['birthdate']
$room[$room_number]['children'][0]['name']
$room[$room_number]['baby'][0]['birthdate']
$room[$room_number]['baby'][0]['name']

看到图案吗? [identifier] [attribute] [identifier] [attribute]

使用此数据结构,我们可以构建您的html输入,并假设有2个孩子和2个婴儿:

<?php
// assuming room number is 123
$room_number = '123';

?>
<!-- child 1 name -->
<label><input name="room[<?= $room_number ?>]['child'][0]['name']">Child 1 name</label>
<!-- child 1 birthdate -->
<label><input name="room[<?= $room_number ?>]['child'][0]['birthdate']">Child 1 birthdate</label>


<!-- child 2 name -->
<label><input name="room[<?= $room_number ?>]['child'][1]['name']">Child 2 name</label>
<!-- child 2 birthdate -->
<label><input name="room[<?= $room_number ?>]['child'][1]['birthdate']">Child 2 birthdate</label>

当您在php脚本中收到这些输入时,它将已经正确地形成为数组(我不包括成年人,并填写了示例值):

php > $room_number='123';
php > $room[$room_number]['child'][0]['birthdate'] = '20010-01-01';
php > $room[$room_number]['child'][0]['name'] ='Junior';
php > $room[$room_number]['child'][1]['birthdate'] = '2019-01-01';
php > $room[$room_number]['child'][1]['name'] = 'Bubba';
php > print_r($room);
Array
(
    [123] => Array
        (
            [child] => Array
                (
                    [0] => Array
                        (
                            [birthdate] => 20010-01-01
                            [name] => Junior
                        )

                    [1] => Array
                        (
                            [birthdate] => 2019-01-01
                            [name] => Bubba
                        )

                )

        )

)

可以很容易地将其输入json_encode:print json_encode($room);

但是,您可能会问计数(总计)是多少?

可以很容易地从数组结构中找出这些内容,因此实际上并不需要包含它们:

php > print count($room[$room_number]['child']);
2
php >

答案 1 :(得分:0)

您可以像这样使用json_encode函数:

json_encode(['rooms' => $rooms])