2017-01-23 2 views
3

Jemand anderes hatte dieses Problem in 2007, aber es wurde nicht beantwortet: In PHP schlägt json_encode ($ someArray) automatisch fehl (gibt null zurück), wenn das Array mehr als 6670 Zeilen enthält. Hat jemand einen Workaround? Wenn Sie beispielsweise die Größe des Arrays auf 6600 begrenzen, wird das erwartete Ergebnis erzielt. Ich kann einige JSON-Aufrufe mit partiellen Arrays machen und Ergebnisse verketten, aber das beinhaltet eine funky String-Manipulation, um sie richtig zusammenzufügen, und das würde ich gerne vermeiden.json_encode codiert nicht mehr als 6670 Zeilen

+1

Könnten Sie ein minimales Beispiel für PHP-Code zur Verfügung stellen, die zeigt, wie und wann dies geschieht? – Pete

+0

Haben Sie versucht, das Speicherlimit von PHP zu erhöhen? – AmericanUmlaut

+0

Haben Sie die maximale Tiefe überprüft? –

Antwort

1

Möglicherweise ist auf der PHP-Version abhängig ist und die für die Verwendung von PHP erlaubt Speicher (und möglicherweise auch die tatsächliche Größe aller Daten im Array). Was Sie tun könnten, wenn alles andere fehlschlägt, ist dies: Schreiben Sie eine Funktion, die die Größe eines gegebenen Arrays überprüft, dann einen kleineren Teil, der codiert werden soll, abspaltet, bis alle Teile codiert sind, und fügen Sie sie erneut hinzu . Wenn dies die Route ist, die du am Ende nimmst, poste einen Kommentar zu dieser Antwort, und vielleicht kann ich dir damit helfen. (Dies basiert auf der Antwort von Nytrix) EDIT, zB unter:

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

Prost! Obwohl ich denke, dass die Wahl für eine for-Schleife statt meiner while-whack noch ein bisschen besser ist. Zählen geht in einer Weile vorbei, fühlt sich einfach dreckig an. ^^ –

+0

Kurz und gut. Ich mag das. Ich habe das noch nicht getestet, aber ich denke, es könnte das Komma zwischen "Brocken" weglassen. (Wenn ja, einfache Lösung) Nochmals vielen Dank. –

+0

Ich habe diesen Code jetzt tatsächlich getestet, er wirft weder 'json' noch sonst etwas aus ... teste ihn [** hier **] (http://sandbox.onlinephpfunctions.com/code/58cecc502255d0800d742bf9e02e65208b73d47b) online – Nytrix

3

Sie könnten immer zuerst slice das Array in 2 Teile (vorausgesetzt, es ist nicht größer als 2 mal diese Zeilen). Danach kodiere es und füge sie wieder zusammen. Falls das keine Lösung ist, müssen Sie Ihr Speicherlimit erhöhen.

Hier ist ein Beispiel, testen Sie es here. Auf @ GeertvanDijk Vorschlag habe ich dies eine flexible Funktion, um die Funktionalität zu erhöhen!

<?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)); 
?> 

Ich habe jetzt dies mit mehr Zeilen dann 6.670 testen. Sie können es auch online here testen.

Nun muss ich erwähnen, dass ich die normale json_encode() mit einer Million Zeilen getestet habe, kein Problem. Dennoch hoffe ich immer noch, dass dies Ihr Problem löst ...


Wenn Ihnen der Speicher ausgeht, können Sie memory_limit auf einen höheren Wert setzen. Ich würde dagegen raten, stattdessen würde ich die Daten in Teilen abrufen und diese in Teilen bearbeiten. Da ich nicht weiß, wie Sie diese Daten abrufen, kann ich kein Beispiel geben, wie Sie das regeln können. Hier ist, wie Sie den Speicher ändern, wenn Sie müssen (manchmal ist es die einzige Option und immer noch "gut").

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

In diesem Fall ist es die Dubbel vom Standard, können Sie sehen, dass es 128M in this documentation

Verwandte Themen