2013-08-26 138 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; 
}