2017-01-23 10 views
3

他の人が'07にこの問題を抱えていましたが、答えが返ってこなかった:配列に6,670行以上ある場合、json_encode($ someArray)は暗黙に失敗します。誰かが回避策を持っていますか?たとえば、アレイのサイズを6600に制限すると、期待される結果が得られます。私は、部分配列で複数のjson呼び出しを行い、結果を連結することもできますが、それは適切につなぎ合わせるためのファンキーな文字列操作を必要とします。json_encodeは6670個以上の行をエンコードしません

+1

あなたはいつ、どのようにこの問題が発生した実証PHPコードの最小限の例を提供してもらえますか? – Pete

+0

PHPのメモリ制限を増やしてみましたか? – AmericanUmlaut

+0

最大深さを確認しましたか? –

答えて

1

ですが、おそらくあなたのPHPのバージョンやPHPで使用するために許可されたメモリに依存していることがわかります(とおそらく配列内のすべてのデータの実際のサイズも)。 指定された配列のサイズをチェックし、次にエンコードする小さな部分を分割し、すべての部分がエンコードされるまでこれを続けてから、再び結合する関数を作成します。これがルートであれば、この回答にコメントを投稿し、おそらく私はそれを手伝うことができます。 (これはNytrixによって回答に基づいている) EDIT、以下の例:

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

乾杯!私のwhile-whackの代わりにforループの選択肢はやや良いと思うが、 whileループで数え切れないほどカウントダウンしている感じがします^^ –

+0

短くて甘い。私はそれが好きです。私はまだこれをテストしていませんが、「チャンク」の間のカンマを省略することができると思います。 (もしそうなら、簡単に修正する)もう一度おねがいします。 –

+0

私は実際にこのコードをテストしましたが、有効な 'json'やその他のものを投げ捨てるわけではありません。テストしてみてください(http://sandbox.onlinephpfunctions.com/code/58cecc502255d0800d742bf9e02e65208b73d47b)オンライン – Nytrix

3

いつも最初にsliceの配列を2つの部分に分けることができます。その後、それをエンコードし、再び一緒に追加します。解決策でない場合は、メモリの上限を増やす必要があります。

ここに例があります。それはhereです。 @ GeertvanDijkの提案では、これを柔軟な機能にして、機能性を高めるようにしました!

これで、6,670個以上の行をテストしました。オンラインでhereをテストすることもできます。

ここでは、通常のjson_encode()を100万行テストしましたが、問題はありません。しかし、私はまだこれがあなたの問題を解決することを願っています...


メモリが足りなくなった場合、 memory_limitをより高い値に設定することができます。私はこれに反して、代わりにデータを部分的に取り出し、部分的にデータを処理します。このデータをどのように取得するのか分からないので、それをどのように規制するのか例を挙げることはできません。必要に応じてメモリを変更する方法があります(唯一のオプションで、それでも "良い"場合もあります)。この場合

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

、それはデフォルトからデュッベルである、あなたはそれが128Mthis documentation

関連する問題