json_encode() PHP 的不同结果

Posted

技术标签:

【中文标题】json_encode() PHP 的不同结果【英文标题】:Different Results for json_encode() PHP 【发布时间】:2012-09-15 18:06:33 【问题描述】:

如果我这样做:

$new_arr = array(
0 => 'keyboard',
1 => 'mouse',
2 => 'computer'
);

print_r(json_encode($new_arr));

输出:

["键盘","鼠标","电脑"]

但是假设我从我的数据库中获取“产品”表的所有行并且我这样做:

$product_with_id_map = array();
foreach($query as $result) 
$product_with_id_map[$result->id] = $result->name;

print_r(json_encode($product_with_id_map));

输出:

"0":"键盘","1":"鼠标","2":"电脑"

我在json_encode时确实需要保留数组的键,你能告诉我如何实现第一个示例中的第二个输出吗?

【问题讨论】:

所以我的问题是正确的:第二个输出形式是想要的,对吧? 是的,我想在我的 json_encode 中保留数组键 “当我 json_encode 时,我真的需要保留数组的键...” 嗯,从技术上讲,你有。两个示例中的键相同。但是第一个是一个数组,另一个只是一个对象,其属性键完全由数字组成。如果解码这个 JSON 的语言是 javascript,这是一个非常微妙的区别(因为数组键是 JavaScript 中的字符串 -- yes, really)。其他语言可能会有所不同。 @T.J.Crowder 嗯,谢谢,这个 json 技术很新 【参考方案1】:

使用选项 (since php 5.3):

print_r(json_encode($product_with_id_map, JSON_FORCE_OBJECT));

【讨论】:

【参考方案2】:

将数组转换为对象。

$new_arr = array(
  0 => 'keyboard',
  1 => 'mouse',
  2 => 'computer'
);

print_r(json_encode((object)$new_arr));
// output: "0":"keyboard","1":"mouse","2":"computer"

补充: 如果你在 javascript 中使用这个结果,我建议你使用数组,数组在 javascript 中也是对象,而且它提供了更多的方法和length 属性给你。

【讨论】:

是的,完美,你能告诉我为什么我得到不同的结果吗? @user1537158 - 因为数组的工作方式与 JSON 中的对象不同。 @xdazz:您甚至不需要将数组转换为对象。 json_encode 的输出可以包含键,因为他是使用递增的数列来构造数组,所以 json_encode 的输出省略了键。当他将该 json_encoded 字符串转换回数组时,这确实没有影响,键将以增量顺序返回。尝试将密钥 1 更改为 4 并查看 json_encode 输出 @xdazz 4 分钟后会接受这个答案,再次感谢您 @ShaktiSingh 那你在暗示什么?【参考方案3】:

发生这种情况是因为从数据库返回的索引以字符串形式返回,因此也在 JSON 中进行编码。当您自己创建数组时,您将它们设置为整数,因此它们被忽略了。

你可以试试

$new_arr = array(
'0' => 'keyboard',
'1' => 'mouse',
'2' => 'computer'
);

print_r(json_encode($new_arr));

或者您可以将数组转换为一个保留索引的对象。

print_r(json_encode((object)$new_arr));

【讨论】:

你的第一段代码不起作用,除非你将数组转换为对象,否则它没有任何区别。

以上是关于json_encode() PHP 的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

2019-11-13 PHP7.x json_encode() Float Issue

php [php:escape json_encode()] #php #js

PHP json_encode 变量如何转换成数组?

php中自带函数 json_encode

PHP 数组中出现中文乱码,json_encode返回结果为null 或false

php json_encode数据格式化2种格式[]和{}