2013-08-24 57 views
1

PHP json_encode和解碼多維數組

Array 
(
    [car] => Array 
     (
      [red] => 0.333 
      [orange] => 0.333 
      [blue] => 0.333 
     ) 

    [truck] => Array 
     (
      [white] => 0.333 
      [green] => 0.333 
      [blue] => 0.333 
     ) 
) 

我一直在使用序列化數組保存到一個文本文件,並反序列化拿回陣列形式的PHP的陣列結構。不幸的是,序列化數組變得非常大,但主要是由於序列化時的浮點(錯誤或設計)轉換。例如,序列化進程將0.333轉換爲.3333333333333333333333333333333333333333333333333。這讓我想切換到json_encode來保存數組。當比較序列化到json_encode時,序列化文件的大小爲40MB,而json_encode的大小爲8MB。

這很好,除了當我嘗試json_decode文件時,它不再是數組形式。我試過json_decode($ array,true),但那也行不通。

任何想法如何讓json_encode在這個例子中工作?

TIA

PS,通過四捨五入小數產生的我的浮點數。我在StackO上發現的另一個答案表明,不是使用round($part/$sum, 3);,而是使用sprintf('%.3f', $part/$sum);將浮點轉換爲字符串。僅此一項將序列化文件從40MB降低到19MB,但仍然比8MB的json_encode文件大得多。

+0

當你解碼json_encoded數據時,你得到了什麼_do_? – 2013-08-24 01:07:20

+1

這裏[phpFiddle](http://phpfiddle.org/main/code/eit-4nm)成功編碼並解碼爲數組格式。 – 2013-08-24 01:15:49

+0

感謝Mike W,你的回答幫助我發現json_decode不適用於大文件。我能夠json_decode的最大的json文件只有大約.5-.6MB。 – Jamex

回答

0

'問題'是由於json_decode無法讀取大的json_encode文件。可以工作的最大的json文件只有〜.5MB。測試4GB Ram,4核Xeon服務器,以及4GB本地主機筆記本電腦。我還在php.ini文件中設置了memory_limit爲其他php例程(是,3GB)爲3GB,並重新啓動了apache。所以memory_limit設置似乎不成問題。

錯誤消息是沒有幫助的,它表示,

警告:array_slice()預計參數1是陣列,在/home/xxxxx/public_html/xxxx.php空給定上線XX

希望這個錯誤信息將有助於未來某個人縮小錯誤。

+0

您的最大文件大小似乎相當小,作爲限制。你的錯誤信息意味着你的解碼器返回了一個'​​null',這將在解碼因爲某種原因失敗時發生,錯誤可以通過調用[json_last_error_msg()]來確定(http://www.php.net/manual/en /function.json-last-error-msg.php)。有可能出現的一些可能的錯誤,其中一些可能會被解決。 – 2013-08-25 04:23:34

+0

感謝您的提示,我發現其他人也表示他們也有json decode處理大型數組的問題,並且有類可以解決這個問題。我認爲.6MB對於遇到這個問題有點小,但是在json解碼失敗之前沒有確定數組的大小。但它可能與陣列的大小和複雜性有關。事實證明,我的數組數據越多,對我的算法不太有用,就不得不恢復到更小的數組。 – Jamex