【问题标题】:php json_encode big arrayphp json_encode 大数组
【发布时间】:2013-08-29 13:34:51
【问题描述】:

我试图在一个大数组上使用json_encode,结果什么也没返回(是的,我检查它是 utf-8)。当我开始调查这个问题时,我发现当字符串大于 65536 时会出现问题。

所以当我的数组大小为 1245 时,它来自 json_encode 的字符串长度为 string(65493),但是当我将数组增加 1 时,字符串变得比 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>';

P.S.对不起各位。我发现了问题,这要感谢一个名字不可复制的人:-)(感谢你的劳伦斯)。 &lt;pre&gt; 是罪魁祸首……由于某种原因,它不会在我的浏览器中打印字符串,但它就在那里。

Lawrence,如果你愿意,你可以写出来,我会接受它是正确的。因为你是我想出这个的原因。

【问题讨论】:

  • 请确保已启用错误报告
  • 你能重现这个行为吗,举个例子。
  • 它不打印字符串但它确实存在?现在这更奇怪了。 :P
  • 请根据提供的答案看一下这个stackoverflow.com/a/6194563/562036,似乎对json_encode()没有限制,但是这个数字65536似乎是java中的字符串限制怎么做你明白了吗?

标签: php json


【解决方案1】:

只是为了消除对这个问题的困惑。答案已经找到,就在问题中。

json_encode 函数没有任何问题。它适用于每个输出。除了你的记忆和你给脚本的多少之外,没有任何限制。

问题在于浏览器对&lt;pre&gt; 标签的实现。如果你给这个标签提供了太大的字符串,它不会打印任何东西。所以出路是输出没有&lt;pre&gt;标签的答案

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,而且数组太大以至于增加内存限制并没有解决我的问题。必须编写我自己的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;
    }
    

    【讨论】:

      【解决方案3】:

      请试试这个,

      $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;
      }
      

      【讨论】:

      • 这行不通。数组对于 json_encode 来说太大了。当它已经崩溃时,你正试图吐它
      【解决方案4】:

      如果数组超出内存限制也会出现这种情况,您可以尝试在php.ini中更改memory_limit,例如

      memory_limit=256M
      

      【讨论】:

        【解决方案5】:

        在我的例子中,我发现数组(来自我的数据库)包含包含特殊字符的字符串,所以我确保在使用 json_encode() 函数之前将它们转换为 utf-8。更多关于: explained here

        【讨论】:

          猜你喜欢
          • 2018-11-20
          • 1970-01-01
          • 2016-02-08
          • 2018-05-21
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多