将json_encode PHP数组作为JSON数组而不是JSON对象返回

139
我在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将我的数组编码为数组呢?

4个回答

242
在RFC 8259中查看Arrays JavaScript对象表示法(JSON)数据交换格式

数组结构用方括号表示,其中包含零个或多个值(或元素)。元素之间用逗号分隔。

array = begin-array [ value *( value-separator value ) ] end-array

您观察到这种行为是因为您的数组不是连续的 - 它具有键02,但没有1作为键。

仅具有数字索引是不够的。只有当您的PHP数组是连续的 - 即其键为0、1、2、3等时,json_encode才会将其编码为JSON数组。

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

echo json_encode(array_values($input)).

7
如果键 0,2 很重要怎么办?我处于无法重新索引数组的情况下。 - shyammakwana.me
4
JSON不支持关联数组。参考:https://tools.ietf.org/html/rfc7159#section-5 - Nguyễn Văn Vinh

77

JSON 中的 Array 仅为索引数组,所以您试图获取的结构不是有效的 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没有将其作为数组而是作为对象处理。现在已经解决了,感谢大家的帮助 :) - user677607
不是这样的。有些库会将关联数组编码为带有索引作为元素属性之一的数组。 - Gustavo
我不明白你的意思 - Martin答案中的数组是非索引的,这是有效的JSON。 - And Finally
@最后,Martin答案中的数组实际上是被隐式地索引的。省略索引会导致索引从零开始的数组。 - Boris Guéry
这个回答并没有完全提供OP在发布问题时想要的内容(毫不奇怪,因为OP想要的是不可能的),而且他们此后对它进行的编辑似乎完全错误,与当前问题状态相差甚远。您无法删除这个回答,因为它被接受了,但也许可以向管理员标记请求删除?由于它有超过5个点赞,您将保留您的声望值。 - Mark Amery

2
json_decode($jsondata, true);会将所有属性转换为数组(无论是顺序还是非顺序)。

请仅翻译文本内容,不要对其进行解释:与OP提出的问题无关。OP特别提到遇到使用json_encode时的编码问题。 - pg2286
1
这与问题无关吗?这展示了使用json_encode的示例,因此将数据转换为可读数组。 OP的问题是“如何使json_encode将我的数组编码为数组”,我的代码正好做到了这一点。我猜测是“编码”这个词引起了你的不满?他所说的“编码”意味着“转换成”。这不是一个downvote的理由。 - Robert Sinclair
哦,我现在明白你的意思了,你建议使用这样的代码:$serialized = json_encode($nonContiguousArray);$unserialize = json_decode($serialized, true);最后 finallySerializedInArrayFormat = json_encode($unserialize);如果这是你想要的,那么你是正确的,但似乎有点冗长。 - pg2286

-3

试试这个,

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

1
这并没有解决原帖作者所提出的问题。 - pg2286

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接