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