json_encode不会编码超过6670行

时间:2017-01-23 22:47:26

标签: php json

其他人在07年遇到了这个问题,但是没有回答:在PHP中,如果数组的行数超过6,670行,json_encode($ someArray)将默默地失败(返回null)。有人有解决方法吗?例如,将数组的大小限制为6600会产生预期的结果。我可以做一些使用部分数组和连接结果的多个json调用,但这涉及一些时髦的字符串操作,以使它们正确地拼接在一起,我想避免这种情况。

2 个答案:

答案 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;
}