2015-10-02 112 views
1

我JSON元素json_decode轉換空數組字符串

{"element":{}, 
"gallery":{ 
    "images":[ 
    {"id":"1","description":{},"image_path":"1.jpg"}, 
    {"id":"2","description":"Test","image_path":"2.jpg"} 
    ]}, 
"additional_value":"Test"} 

PHP函數json_decode($ JSON,TRUE)返回

Array 
(
    [element] => Array() 
    [gallery] => Array(
      [images] => Array(
        [0] => Array(
          [id] => 1 
          [description] => Array() 
          [image_path] => 1.jpg) 
        [1] => Array(
          [id] => 2 
          [description] => Test 
          [image_path] => 2.jpg) 
        ) 
      ) 
    [additional_value] => Test 
) 

我怎麼能代替/轉換空數組字符串?例如:

[0] => Array([id] => 1 
       [description] => "" 
       [image_path] => 1.jpg) 

謝謝!

+0

如果您無法避免將'description'設置爲JSON對象,則必須使用PHP手動進行轉換。 – RhinoDevel

+1

要添加到@RhinoDevel,您可以使用'array_walk_recursive()'。 – frz3993

+0

@ frz3993原來不行。 – GolezTrol

回答

3

我認爲這樣做的最好方法似乎是(但它不是!)解碼json,之後使用array_walk_recursive將空數組轉換爲空字符串。

該函數遞歸地遍歷數組的所有項。它們中的每一個都通過引用傳遞給指定的回調函數。

但是,事實證明,該函數不會調用本身爲數組的項目的回調,而只會針對這些數組中的項目調用回調。這種行爲使得使用array_walk_recursive無法找到空數組。

因此,我已經編寫了一個替換函數,它應該完全相同,除了在深入遞歸之前,它總是會調用本身爲數組的項的回調函數。

該函數和調用代碼可以在下面找到。

<?php 
// The replacement function for array_walk_recursive() 
function my_array_walk_recursive(&$array, $callback, $userdata = null) { 
    if (!is_array($array)) return false; 

    foreach ($array as $key => &$value) { 
    // Difference: PHP's array_walk_recursive will only call the callback 
    // for items that are not arrays themselves. Here, the callback is always called. 
    call_user_func_array($callback, array(&$value, $key, $userdata)); 
    if (is_array($value)) { 
     my_array_walk_recursive($value, $callback, $userdata); 
    } 
    } 
    return true; 
} 

// The calling code. 
$json = 
    '{"element":{}, 
    "gallery":{ 
     "images":[ 
     {"id":"1","description":{},"image_path":"1.jpg"}, 
     {"id":"2","description":"Test","image_path":"2.jpg"} 
     ]}, 
    "additional_value":"Test"}'; 

$yourArray = json_decode($json, TRUE); 

my_array_walk_recursive(
    $yourArray, 
    function(&$item, $key){ 
    if (is_array($item) && count($item) === 0) { 
     $item = "x"; 
    } 
    }); 

var_dump($yourArray); 
+0

不幸的是,array_walk_recursive跳過這些值。無論如何感謝您的鏈接,我認爲這對未來有所幫助。 –

+0

啊。它跳過它,因爲'array_walk_recursive'只訪問數組的項目,而不是數組本身。這些是文檔頁面頂部評論中提到的'葉節點'。解決這個問題的一種方法是使用遞歸函數自己遍歷數組。 – GolezTrol

+0

我寫了一個替換。這次我測試了它,所以它現在應該可以工作。 :-) – GolezTrol

0

正確的工作下一個代碼/招

$json_upd = str_replace('{}', '""', $json); 
$result = json_decode($json_upd,TRUE); 

如果有人有更好的解決方案,請加註釋 - 我會很感激。

+0

這是一種可能性,但可能有副作用,例如,當json中的字符串包含「{}」時。 – GolezTrol