【问题标题】:Different Results for json_encode() PHPjson_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 技术很新

标签: php json codeigniter


【解决方案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));
    

    【讨论】:

    • 你的第一段代码不起作用,除非你将数组转换为对象,否则它没有任何区别。
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2015-09-29
    • 2012-06-02
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多