6

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

因此,当我的数组大小为 1245 时,它的字符串 fromjson_encode的长度为 string(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>';

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

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

4

5 回答 5

1

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

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

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

于 2013-10-03T10:47:59.700 回答
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;
}
于 2016-05-12T09:57:38.553 回答
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;
}
于 2013-10-03T10:15:46.017 回答
0

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

memory_limit=256M
于 2019-01-20T15:45:08.933 回答
0

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

于 2019-07-02T09:24:46.947 回答