1

私はphp配列構造を持っています

Array
(
    [car] => Array
        (
            [red] => 0.333
            [orange] => 0.333
            [blue] => 0.333
        )

    [truck] => Array
        (
            [white] => 0.333
            [green] => 0.333
            [blue] => 0.333
        )
)

シリアル化を使用して配列をテキスト ファイルに保存し、シリアル化を解除して配列形式を取得しています。残念ながら、シリアル化された配列は非常に大きくなっていますが、主にシリアル化時の浮動小数点 (バグまたは設計による) 変換が原因です。たとえば、0.333 の代わりに、シリアル化されたプロセスは .333 を .333333333333333333333333333333333333333333333 に変換します。これにより、json_encode に切り替えて配列を保存したくなりました。シリアル化を json_encode と比較すると、シリアル化されたファイルのサイズは 40MB で、json_encode のサイズは 8MB です。

これは素晴らしいことですが、ファイルを json_decode しようとすると、配列形式ではなくなります。json_decode($array, true) を試しましたが、それもうまくいきません。

この例で json_encode を機能させる方法はありますか?

ティア

PS、浮動小数点数は小数点以下を四捨五入して生成されました。私が StackO で見つけた別の回答は、 をround($part/$sum, 3);使用する代わりにsprintf('%.3f', $part/$sum);、浮動小数点を文字列に変換したものを使用することを提案しました。それだけで、シリアル化されたファイルは 40MB から 19MB に削減されましたが、それでも json_encode ファイル サイズの 8MB よりもはるかに大きくなっています。

4

1 に答える 1

0

「問題」は、json_decode が大きな json_encode ファイルを読み取れないことが原因です。機能する最大の json ファイルはわずか 0.5 MB です。4GB RAM、4 コア Xeon サーバー、および 4GB localhost ラップトップでテスト済み。また、php.ini ファイルの memory_limit を他の php ルーチン用に 3GB (はい、3GB) に設定し、Apache を再起動しました。したがって、memory_limit の設定は問題ではないようです。

エラーメッセージは役に立ちませんでした。

警告: array_slice() は、パラメーター 1 が配列であることを想定しています。null は、行 xx の /home/xxxxx/public_html/xxxx.php で指定されています

このエラー メッセージが将来、バグを絞り込むのに役立つことを願っています。

于 2013-08-24T02:39:43.767 に答える