2014-01-05 56 views
5

我有此示例代碼:在JSON編碼中使用深度的目的是什麼?

$array = array(

    'GiamPy' => array(
      'Age' => '18',  
      'Password' => array(
        'password' => '1234', 
        'salt' => 'abcd', 
        'hash' => 'whirlpool' 
      ), 
     'Something' => 'Else' 
    ) 

); 

echo json_encode($array, JSON_PRETTY_PRINT); 

我看到PHP文檔,由於PHP 5.5.0(因此最近),json_encode允許一個新的參數,其是深度英寸

  1. 它的用途是什麼?
  2. 爲什麼我會需要它?
  3. 它爲什麼在PHP 5.5.0中添加了?
+0

由於該參數的文檔相當稀少,我認爲這是一個體面的問題。一個可以通過一點實驗來回答的問題,但是還算體面。 – deceze

+0

您將需要它有超過512個嵌套數組,並且您希望將它們保留在生成的JSON中。 – davidkonrad

+0

我想這是爲了防止用不明顯的遞歸編碼對象時走出內存。 –

回答

6

該選項限制將要處理的深度(d'uh)。數組的深度是通過嵌套的深度來衡量的。這是深度1的數組:

array(
    'foo', 
    'bar', 
    'baz' 
) 

這是深度2的數組:

array(
    array(
     'foo' 
    ), 
    array(
     'bar' 
    ), 
    array(
     'baz' 
    ) 
) 

// ------ depth ------> 

如果輸入超過最大深度(默認512),json_encode將簡單地返回false

爲什麼你可能會使用這個問題值得商榷,你可能想保護自己免受無意的無限遞歸或太多的資源使用。一個比512級更深的數組可能具有無限遞歸引用並且不能被序列化。但是如果你確定你的數組不是無限遞歸,但是比512更深,你可能想明確地增加這個限制。您可能還想降低這個限制作爲一個簡單的錯誤捕獲器;假設你期望結果具有最大深度,但是你的輸入數據可能有些不可預測。

+0

爲什麼有人需要在陣列中有512個深度?那是瘋子,對吧?但是,像50,60或70這樣的數字是非常高的,不是嗎? – GiamPy

+1

確切地說,你可能*永遠不會擁有一個深度爲512的數組,所以這是一個非常安全的默認上限。我想這一直是'json_encode'用來防止無限遞歸的一種方法。在5.5中,這個參數已經暴露給你,你現在可以根據需要改變它。可能有人遇到了這個限制,需要增加。如果你真的對這個參數爲什麼現在浮出水面感興趣,請參考PHP源代碼提交歷史記錄。 – deceze

+0

我會看看 - 謝謝你的時間! – GiamPy

相關問題