2017-01-23 58 views
3

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

+1

你能提供的演示发生这种情况时如何和PHP代码最小的例子吗? – Pete

+0

你有没有尝试过增加PHP的内存限制? – AmericanUmlaut

+0

你检查了最大深度吗? –

回答

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; 
} 
+1

干杯!虽然我认为选择for循环而不是我的while-whack仍然更好一些。计数在一段时间循环只是感觉肮脏我猜^^ –

+0

短而甜。我喜欢。我还没有测试过,但我认为它可能会省略“块”之间的逗号。 (如果是这样,容易修复)再次感谢。 –

+0

我现在已经测试了这段代码,它并没有抛出有效的'json',也没有其他东西......测试它[** here **](http://sandbox.onlinephpfunctions.com/code/58cecc502255d0800d742bf9e02e65208b73d47b)在线 – Nytrix

3

你总是可以将第一个slice数组分成2个部分(假设它不大于​​那些行的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设置为更高的值。我会反对这个建议,相反我会检索数据的部分,并在一定程度上处理这些数据。因为我不知道你是如何检索这些数据的,所以我不能举一个例子来说明如何调节这些数据。这里是你如何改变内存以防万一你需要(有时它是唯一的选择,并且仍然是“好”)。

ini_set("memory_limit","256M"); 

在这种情况下,它是从默认的杜贝尔,你可以看到它是128Mthis documentation