php json_编码大数组

php json_编码大数组,php,json,Php,Json,我试图在一个大数组上使用json\u encode,结果什么也不返回(是的,我检查了它是否为utf-8)。当我开始研究这个问题时,我发现当字符串大于65536时,问题就会出现 因此,当我的数组大小为1245时,json_encode中的字符串长度为字符串的长度(65493),但当我仅将数组增加1时,字符串长度将超过65536,json_encode无法输出任何结果 我以为问题是因为内存限制,但当我检查php.ini时,我发现它是-1 知道什么是问题吗 基本上我是这样做的: $arr = arra

我试图在一个大数组上使用
json\u encode
,结果什么也不返回(是的,我检查了它是否为utf-8)。当我开始研究这个问题时,我发现当字符串大于65536时,问题就会出现

因此,当我的数组大小为1245时,
json_encode
中的字符串长度为字符串的长度(65493),但当我仅将数组增加1时,字符串长度将超过65536,json_encode无法输出任何结果

我以为问题是因为
内存限制
,但当我检查php.ini时,我发现它是-1

知道什么是问题吗

基本上我是这样做的:

$arr = array();
for($i =0; $i<9000; $i++){
    $arr[] = array(
        'name'  => 'test',
        'str'   => md5($i)
    );
}
echo '<pre>'.json_encode($arr).'</pre>';
$arr=array();
对于($i=0;$i“测试”,
'str'=>md5($i)
);
}
回显“”。json_编码($arr)。“”;
p.S.对不起,伙计们。我发现了这个问题,多亏了一个名字不可打印的人:-)(谢谢你的劳伦斯)。
是罪魁祸首。。。出于某种原因,它不会在我的浏览器中打印字符串,但它在那里

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

请试试这个

memory_limit=256M
$arr=array();
对于($i=0;$i“测试”,
'str'=>md5($i)
);
}
$contentArr=str_split(json_encode($arr),65536);
foreach($contentArr作为$part){
回声部分;
}

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

json\u encode
函数没有问题。它对每个输出都正常工作。这里没有限制,除了你的内存和你给脚本的内存


问题在于浏览器对
标记的实现。如果您为此标记提供了太大的字符串,则它不会打印任何内容。因此,解决方法是在不带标签的情况下输出答案。我也有同样的问题,而且数组太大了,增加内存限制并不能解决我的问题。必须编写自己的
jsonEncode()
-方法来克服这个问题:

/**
*处理大数组的json_encode()的替代方法
*由于内存问题,常规json_编码将返回NULL。
*@param$arr
*@返回字符串
*/
私有函数jsonEncode($arr){
$str='{';
$count=计数($arr);
$current=0;
foreach($arr作为$key=>$value){
$str.=sprintf(“%s”:,$this->sanitizeForJSON($key));
if(是_数组($value)){
$str.='[';
foreach($value as&$val){
$val=$this->sanitizeForJSON($val);
}
$str.=''''”。内爆(''','',$value)。'''';
$str.=']';
}否则{
$str.=sprintf('%s',$this->sanitizeForJSON($value));
}
$current++;
如果($当前<$计数){
$str.=',';
}
}
$str.='}';
返回$str;
}
/**
*@param string$str
*@返回字符串
*/
私有函数sanitizeForJSON($str)
{
//删除所有斜线:
$str=条带斜杠($str);
//仅转义反斜杠:
$str=str\u replace(“”、“\”、$str);
返回$str;
}

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


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

请确保启用了错误报告功能。在一个示例中,您可以重新生成该行为。它不会打印字符串,但它实际上存在吗?现在这更奇怪了
:P
请根据答案查看此问题,前提是json_encode()似乎没有限制,但是这个数字65536似乎是java中的字符串限制。您是如何获得的?是否尝试过?这将不起作用。数组太大,无法进行json_编码。当它已经崩溃时,你正试图吐出来
/**
 * 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;
}
memory_limit=256M