2012-09-24 51 views
5

如果我这样做:不同结果json_encode()PHP

$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也可以告诉我如何实现第一个例子中的第二个输出?

+1

只是让我的问题正确:第二个输出形式是所需的,对吧? – vzwick

+0

yes确切地说,我想保留数组键在我的json_encode –

+2

*“我真的需要保留阵列的关键,当我json_encode ...”*呃,从技术上说,你有。两个例子中的键都是相同的。但第一个是一个数组,另一个只是一个完全由数字组成的属性键的对象。如果解码这个JSON的语言是JavaScript,这是一个非常微妙的差异(因为数组键是JavaScript中的字符串 - [是,真的](http://blog.niftysnippets.org/2011/01/myth-of-arrays。 HTML))。其他语言可能不同。 –

回答

6

将数组转换为对象。

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

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

Addtion: 如果你使用这个结果在JavaScript中,我建议你使用数组,数组也反对在JavaScript中,此外,它提供了更多的方法和属性length给你。

+0

是完美的作品,请你告诉我为什么我得到不同的结果? –

+0

@ user1537158 - 因为数组的工作方式与JSON中的对象不同。 – vzwick

+0

@xdazz:你甚至不需要将数组转换为对象。 json_encode的输出可以包含关键字,因为他使用递增数字序列来构造数组,所以json_encode输出省略了关键字。当他将json_encoded字符串转换为数组时,这实际上不起作用,按键将按递增顺序返回。尝试更改密钥'1'到'4'并查看json_encode输出 –

8

使用的选项(since PHP 5.3):

print_r(json_encode($product_with_id_map, JSON_FORCE_OBJECT)); 
2

这是发生,因为正在从数据库返回的索引回来为字符串,因此在该JSON被编码了。当你自己创建数组时,你将它们设置为整数,因此它们被忽略。

你既可以尝试

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

print_r(json_encode($new_arr)); 

,或者你可以在阵列真理的为对象,将保留索引。

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

您的第一段代码不起作用,除非您将该数组转换为目的。 – xdazz