2014-09-05 114 views
1

我創建一個處理JSON輸入(通過$ _POST變量)的PHP腳本。它從JSON中提取數據並將其上載到SQL數據庫。我想JSON以特定的格式:json_encode更改數組與對象

$object = json_decode('{ 
    "key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}], 
    "key_b":[{"value_a":10,"value_b":7}], 
    "key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}] 
    }',true); 

基本上,除了按鍵的對象,每個應保存數組(不管它的大小是)。我使用json_decode(json,true)將其轉換爲關聯數組(而不是對象)。我必須爲每個鍵添加大量檢查,檢查它們是否爲「對象或數組」(因爲抽取的ASP.net頁面將數組轉換爲對象中的單個對象 - 刪除數組持有他們)。支票然後將它們轉換回陣列,如果有「S的物體,其中我」 D喜歡的陣列保持的對象:

if(is_object($object["key_b"])) 
{ 
    $a = array(); 
    $a[] = $object["key"]; 
    $object["key"] = $a; 
} 

然後我通過陣列迭代,加入值的行在SQL數據庫中。這一切工作正常,但與json_encode轉換回JSON時,在只有一個對象持有陣列的任何鍵,刪除陣列,以及鍵下只留下對象:

echo(json_encode($object)); 
// RETURNED JSON 
'{ 
     "key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}], 
     "key_b":{"value_a":10,"value_b":7}, 
     "key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}] 
    }' 

你看,key_b沒有更長的持有一個數組,但一個對象!這真的很煩人,因爲我打算創建一個遍歷數組的JavaScript腳本,爲每個對象添加一個DOM元素(div)。

爲什麼會發生這種情況?有什麼辦法讓他們爲數組,即使有試過「數組中的唯一一個對象

我?」:

if(is_object($object["key_b"])) 
{ 
    $a = array(); 
    $a[] = array_values($object["key"]); 
    $object["key"] = $a; 
} 

if(is_object($object["key_b"])) 
{ 
    $a = array(); 
    $a[0] = array_values($object["key"]); 
    $object["key"] = $a; 
} 

但好像沒有什麼能夠阻止json_encode以這種方式影響JSON。

解決這個問題並不難 - 但它意味着每個鍵添加一個檢查(檢查它是一個數組還是值),當數據抽取真的很大時,這特別耗時。

任何意見將不勝感激。

編輯:改變「,以」在JSON - 儘管,這只是一個例子,我剛寫來顯示結構

編輯:我使用引用把我的編碼時間下來,如果這個改變任何東西?:

$t =& $object["key_b"]; 
if(is_object($t)) 
{ 
    $a = array(); 
    $a[] = $t; 
    $t = $a; 
} 
+0

Javascript/JSON調用「對象」和PHP調用對象的內容大相徑庭。 '$ object [「key」]'究竟是什麼?你的代碼是否在被執行? – deceze 2014-09-05 15:15:22

+0

我只是寫它作爲一個例子 - 這不是我使用的實際JSON,對不起。 – 2014-09-05 15:15:44

+0

嗯,好問題,欺騙 - 我不確定!我對待這個像javascript對象/數組。 – 2014-09-05 15:16:38

回答

0

它出現在一個關聯數組的鍵使用is_object()將不會返回true我只是敲了這個例子,來證明這一點:

$json = json_decode('{"job_details":{"a":[{"x":5},{"y":23},{"z":18}],"b":{"x":19},"c":[{"x":64},{"y":132}]}}',true); 

echo(json_encode($json)."<br><br>"); 

$t =& $json["job_details"]["b"]; 
if(is_object($t)) 
{ 
    $a = array(); 
    $a[] = $t; 
    $t = $a; 
    echo("IS OBJECT<br><br>"); 
} 

echo(json_encode($json)); 

我會找到另一種方式檢查關聯數組鍵中的值。

我實際上是在試圖找出鍵中的值是否是一個關聯數組(不是對象) - 我只是沒有意識到它們在PHP中是不同的。

我必須只使用這個自定義函數:

function is_assoc($array) 
{ 
    return (bool)count(array_filter(array_keys($array), 'is_string')); 
} 

來源:How to check if PHP array is associative or sequential?

如果值是一個關聯數組返回true。

+0

不正確。 is_object測試對象。你陣列的價值發生不是一個。所有的PHP陣列都是雙模式的。聯想+順序。 PHP不關心。但是'$ a ['foo'] =新的StdClass; var_dump(is_object($ a ['foo']))'將返回true。 – 2014-09-05 18:46:14

+0

是的,但是當使用json_decode()時,您可以將其用作將JSON轉換爲對象的json_decode($ string),或者將JSON轉換爲關聯數組的json_decode(string,true)。 – 2014-09-06 01:14:45