我试图在一个大数组上使用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>
是罪魁祸首...由于某种原因,它不会在我的浏览器中打印字符串,但它就在那里。
答案 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