php json_encode大数组

时间:2013-08-26 23:31:12

标签: php json

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

因此,当我的数组大小为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>';

P.S。对不起伙计们。我发现了这个问题,感谢一个名字不明确的人:-)(谢谢你的劳伦斯)。 <pre>是罪魁祸首...由于某种原因,它不会在我的浏览器中打印字符串,但它就在那里。

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

5 个答案:

答案 0 :(得分:1)

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

json_encode功能没有任何问题。它适用于每个输出。除了你的记忆以及你给你的脚本有多少外,没有任何限制。

问题在于浏览器实现<pre>标记。如果为此标记提供过大的字符串,则不会打印任何内容。所以出路就是输出没有<pre>标签的答案

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}

答案 3 :(得分:0)

如果数组超出内存限制,也会发生这种情况,您可以尝试更改php.ini中的memory_limit之类的

memory_limit=256M

答案 4 :(得分:0)

在我的情况下,我发现数组(从我的数据库派生)包含包含特殊字符的字符串,因此在使用json_encode()函数之前,我确保将其转换为utf-8。更多信息: explained here