提问者:小点点

json_encodePHP数组为JSON数组而不是JSON对象


我在PHP中有以下数组:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

我想将其JSON编码为JSON数组,生成如下字符串:

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

但是当我在这个数组上调用json\u encode时,我得到以下结果:

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

它是一个对象而不是数组。

如何让json\u encode将我的数组编码为数组?


共3个答案

匿名用户

请参见RFC 8259中的数组JavaScript对象符号(JSON)数据交换格式:

数组结构表示为围绕零个或多个值(或元素)的方括号。元素之间用逗号分隔。

数组=开始数组[值*(值分隔符值)]结束数组

您观察到这种行为是因为您的数组不是顺序的——它有键02,但没有1作为键。

仅有数字索引是不够的。json_encode只会将PHP数组编码为JSON数组,如果PHP数组是顺序的-也就是说,如果它的键是0,1,2,3,...

您可以使用array\u values函数按顺序重新索引数组,以获得所需的行为。例如,以下代码在您的用例中成功运行:

echo json_encode(array_values($input)).

匿名用户

JSON中的Array仅为索引数组,因此您试图获取的结构不是有效的Json/Javascript。

PHP关联数组是JSON中的对象,因此除非您不需要索引,否则无法进行此类转换。

如果您想获得这样的结构,可以执行以下操作:

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

Will返回类似这样的东西:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]

匿名用户

json_解码($jsondata,true);

true将所有属性转换为数组(顺序或不顺序)