其他人在07年遇到了这个问题,但是没有回答:在PHP中,如果数组的行数超过6,670行,json_encode($ someArray)将默默地失败(返回null)。有人有解决方法吗?例如,将数组的大小限制为6600会产生预期的结果。我可以做一些使用部分数组和连接结果的多个json调用,但这涉及一些时髦的字符串操作,以使它们正确地拼接在一起,我想避免这种情况。
答案 0 :(得分:3)
你总是可以先将slice
阵列分成两部分(假设它不大于那些行的2倍)。之后对其进行编码,然后将它们再次添加到一起。如果不是解决方案,则需要增加内存限制。
这是一个例子,测试它here。在@GeertvanDijk建议中,我使这个功能变得灵活,以增加功能!
<?php
$bigarray = array(1,2,3,4,5,6,7,8,9);
function json_encode_big($bigarray,$split_over = 6670){
$parts = ceil((count($bigarray) / $split_over));
$start = 0;
$end = $split_over;
$jsoneconded = [];
for($part = 0; $part < $parts; $part++){
$half1 = array_slice($bigarray,$start,$end);
$name = "json".$part;
$$name = ltrim(rtrim(json_encode($half1),"]"),"[");
$jsoneconded[] = $$name;
$start += $split_over;
}
return "[".implode($jsoneconded,",")."]";
}
print_r(json_encode_big($bigarray));
?>
我现在用更多的行然后测试6,670。您也可以在线here进行测试。
现在,我必须提一下,我测试了普通json_encode()
一百万行,没问题。然而,我仍然希望这能解决你的问题......
memory_limit
设置为更高的值。我会建议不要这样做,而是我会检索部分数据,然后分成几部分。由于我不知道如何检索这些数据,我无法举例说明如何对其进行规范。以下是您在需要时更改内存的方式(有时它是唯一的选项,而且仍然是#34;良好&#34;)。
ini_set("memory_limit","256M");
在这种情况下,它是来自默认的dubbel,您可以在this documentation
中看到它是128M
答案 1 :(得分:1)
可能取决于您的PHP版本和PHP允许使用的内存(也可能取决于数组中所有数据的实际大小)。 如果一切都失败了你能做什么,是这样的: 编写一个函数来检查给定数组的大小,然后拆分一个将要编码的较小部分,然后继续这样做,直到所有部分都被编码,然后再次连接它们。如果这是您最终选择的路线,请对此答案发表评论,也许我可以帮助您解决问题。 (这是基于Nytrix的答案) 编辑,例如:
function encodeArray($array, $threshold = 6670) {
$json = array();
while (count($array) > 0) {
$partial_array = array_slice($array, 0, $threshold);
$json[] = ltrim(rtrim(json_encode($partial_array), "]"), "[");
$array = array_slice($array, $threshold);
}
$json = '[' . implode(',', $json) . ']';
return $json;
}