2012-09-24 53 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