解码json时保持关联数组

时间:2017-02-06 05:20:15

标签: javascript php arrays json

例如我有以下数组: -

$menu = array(
    "result"=>array(
        "food"=>array(
            "Nasi Padang",
            "Kentang Goreng",
            "Potato Wedges"
        ),
        "drink"=>array(
            "Bajigur",
            "AO",
            "Sabun"
        )
    )
);

使用json_encode上述代码变为: -

{
    "result":{
        "food":[
            "Nasi Padang",
            "Kentang Goreng",
            "Potato Wedges"
        ],
        "drink":[
            "Bajigur",
            "AO",
            "Sabun"
        ]
    }
}

正如您所看到的,result数组成为一个对象而不是以数组的形式保留,这可能是因为JavaScript没有开箱即用的关联数组。

那么,有没有将result(在做json_decode之后)作为数组处理而没有像(array)这样的任何演员?

编辑: 响应Anant的回复/评论,我在我的localhost中尝试了以下代码

$test = new stdClass;
$test->count = 1337;
$test->page = 2;

$menu = array(
    "test"=>$test,
    "result"=>array(
        "food"=>array(
            "Nasi Padang",
            "Kentang Goreng",
            "Potato Wedges"
        ),
        "drink"=>array(
            "Bajigur",
            "AO",
            "Sabun"
        )
    )
);

$json = json_encode($menu);
echo print_r(json_decode($json, true));

结果

Array
(
    [test] => Array
        (
            [count] => 1337
            [page] => 2
        )

    [result] => Array
        (
            [food] => Array
                (
                    [0] => Nasi Padang
                    [1] => Kentang Goreng
                    [2] => Potato Wedges
                )

            [drink] => Array
                (
                    [0] => Bajigur
                    [1] => AO
                    [2] => Sabun
                )

        )

)

1 个答案:

答案 0 :(得分:0)

  

正如您所看到的,结果数组成为一个对象而不是保持数组的形式,这可能是因为JavaScript没有开箱即用的关联数组。

这是因为在JSON中,普通对象与PHP中的关联数组具有相同的用途。唯一的区别是它没有订购。

JSON没有具有已命令的命名属性的数据结构。要实现这一点,您需要使用一组对象,例如:

[
    { "name" : "foo", "value" : 1 },
    { "name" : "bar", "value" : 2 }
]
  

所以,无论如何将结果(在执行json_decode之后)作为数组处理而没有像(数组)这样的任何转换?

来自the manual

  

assoc:当为TRUE时,返回的对象将被转换为关联数组。

因此,将json_decode的第二个参数设置为true