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