2013-08-26 114 views
5

我想在大數組上使用json_encode,結果什麼都沒返回(是的,我檢查它是utf-8)。當我開始調查此問題時,發現問題出現在字符串變得大於65536時。php json_encode big array

因此,當我的數組大小爲1245時,其字符串json_encode的長度爲字符串(65493),但當我增加數組只有一個,字符串變得比65536更長,json_encode無法輸出任何結果。

我認爲這個問題是因爲memory limit,但是當我檢查我的php.ini時,我發現它是-1。

任何想法可能是一個問題?

基本上我做這樣的事情:

$arr = array(); 
for($i =0; $i<9000; $i++){ 
    $arr[] = array(
     'name' => 'test', 
     'str' => md5($i) 
    ); 
} 
echo '<pre>'.json_encode($arr).'</pre>'; 

附:對不起。我發現了這個問題,這要感謝一位不可打印名字的人:-)(感謝你的勞倫斯)。 <pre>是罪魁禍首...由於某種原因,它不會在我的瀏覽器中打印字符串,但它在那裏。

勞倫斯,如果你願意,你可以寫下來,我會接受它是正確的。因爲你是我提出這個問題的原因。

+0

請確保錯誤報告已啓用 – HamZa

+1

你能否再重現行爲,在一個例子。 –

+0

它不打印字符串,但它實際上在那裏?現在,這甚至是更怪異的。 ':P' –

回答

1

只是刪除有關這個問題的困惑。答案已經找到,問題在這裏。

json_encode函數沒有錯。它適用於每個輸出。除了你的記憶以外,你沒有任何限制,你有多少給你的腳本。

問題出在瀏覽器實現<pre>標籤。如果你給這個標籤提供了太大的字符串,它不會打印任何東西。所以出路是輸出答案沒有<pre>標籤

0

請試試這個,

$arr = array(); 
for($i =0; $i<3000; $i++){ 
$arr[] = array(
    'name' => 'test', 
    'str' => md5($i) 
); 
} 
$contentArr = str_split(json_encode($arr), 65536); 
foreach ($contentArr as $part) { 
    echo $part; 
} 
+0

這不起作用。該數組對於json_encode來說太大了。你試圖在它已經崩潰時吐出它 –

1

我有同樣的問題,數組是如此之大,增加內存限制並沒有解決我的問題。不得不寫我自己的jsonEncode() - 方法解決此問題:

/** 
* Alternative to json_encode() to handle big arrays 
* Regular json_encode would return NULL due to memory issues. 
* @param $arr 
* @return string 
*/ 
private function jsonEncode($arr) { 
    $str = '{'; 
    $count = count($arr); 
    $current = 0; 

    foreach ($arr as $key => $value) { 
     $str .= sprintf('"%s":', $this->sanitizeForJSON($key)); 

     if (is_array($value)) { 
      $str .= '['; 
      foreach ($value as &$val) { 
       $val = $this->sanitizeForJSON($val); 
      } 
      $str .= '"' . implode('","', $value) . '"'; 
      $str .= ']'; 
     } else { 
      $str .= sprintf('"%s"', $this->sanitizeForJSON($value)); 
     } 

     $current ++; 
     if ($current < $count) { 
      $str .= ','; 
     } 
    } 

    $str.= '}'; 

    return $str; 
} 

/** 
* @param string $str 
* @return string 
*/ 
private function sanitizeForJSON($str) 
{ 
    // Strip all slashes: 
    $str = stripslashes($str); 

    // Only escape backslashes: 
    $str = str_replace('"', '\"', $str); 

    return $str; 
}