json_encode将PHP数组稀疏为JSON数组,而不是JSON对象


119

我在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_encode此数组时,得到以下信息:

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

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

我怎样才能json_encode将我的数组编码为数组?

Answers:


194

您正在观察此行为,因为您的数组不是顺序的-它具有键02,但没有1键。

仅具有数字索引是不够的。json_encode仅当您的PHP数组是顺序的时(即,其键为0、1、2、3,...)时,才会将PHP数组编码为JSON数组。

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

echo json_encode(array_values($input)).

4
但是,如果键0,2很重要怎么办?我处于无法重新索引数组的相同情况。
shyammakwana.me 2015年

2
JSON不支持关联数组。请参阅:tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh,

74

ArrayJSON是索引数组,因此您尝试获取的结构无效的Json / Javascript。

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

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

$indexedOnly = array();

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

json_encode($indexedOnly);

将返回类似:

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

1
感谢您为我提供了索引数组的线索:)问题是我以一种方式对它进行了索引,该ID也是该数组的ID而不是一个顺序的ID,并且json_encode并未将其作为数组,而是对象而不是因为数组不是按顺序固定的,现在感谢您的所有帮助人员:)

不对。一些库确实将关联数组编码为具有索引作为元素属性之一的数组。
古斯塔沃

我不明白您的意思-Martin回答中的数组未建立索引,并且这是有效的JSON。
最后

@AndFinally,在马丁的回答阵列实际索引,含蓄。省略索引会导致索引数组从零开始。
鲍里斯·格里(BorisGuéry)2015年

这个答案并没有完全提供OP在他们发布问题时想要的内容(毫不奇怪,因为OP想要的东西是不可能的),并且自那时以来对它们的编辑使该答案在看来似乎是错误的。题。您无法删除此答案,因为它已经被接受,但是也许标记为主持人为您删除它?由于它有5次以上的投票,因此您将保留自己的代表。
Mark Amery

0

json_decode($ jsondata,true);

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


与OP提出的问题无关。OP特别询问使用以下方法遇到的编码问题json_encode
pg2286 '17

这有什么关系?该示例显示了使用json_encode的示例,该示例将数据转换为可读数组。OP的问题是“如何获取json_encode来将我的数组编码为数组”,我的一点代码就是这样做的。“编码”是指“变成”。那不是拒绝投票的理由。
罗伯特·辛克莱

哦,我现在明白您的意思了,如果您打算这样做的话,那么您$serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); 最终会推荐这样的事情finallySerializedInArrayFormat = json_encode($unserialize);,但是似乎有点棘手的解决方案。
pg2286

-1

试试这个,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>

这不能解决OP试图问的问题。
pg2286
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.