6

大きな配列で使用しようとしていますjson_encodeが、結果は何も返されません (はい、utf-8 であることを確認しました)。この問題の調査を開始したところ、文字列が 65536 を超えると問題が発生することがわかりました。

したがって、配列のサイズが 1245 の場合、その文字列json_encodeの長さは string(65493) になりますが、配列を 1 つだけ増やすと、文字列が 65536 より長くなり、json_encode は結果を出力できません。

問題は が原因だと思っていましたがmemory limit、php.ini を確認すると -1 になっています。

何が問題になる可能性がありますか?

基本的に私はこのようなことをしています:

$arr = array();
for($i =0; $i<9000; $i++){
    $arr[] = array(
        'name'  => 'test',
        'str'   => md5($i)
    );
}
echo '<pre>'.json_encode($arr).'</pre>';

PS申し訳ありません。転載できない名前の人のおかげで、私は問題を見つけました:-) (ローレンスに感謝します)。 <pre>犯人です...何らかの理由で、ブラウザに文字列が出力されませんが、そこにあります。

ローレンス、あなたが望むなら、それを書いていただければ、私はそれを正しいものとして受け入れます。あなたが私がこれを思いついた理由だからです。

4

5 に答える 5

1

私は同じ問題を抱えていましたが、配列が非常に大きかったため、メモリ制限を増やしても問題は解決しませんでした。jsonEncode()これを克服するために私自身の方法を書かなければなりませんでした:

/**
 * Alternative to json_encode() to handle big arrays
 * Regular json_encode would return NULL due to memory issues.
 * @param $arr
 * @return string
 */
private function jsonEncode($arr) {
    $str = '{';
    $count = count($arr);
    $current = 0;

    foreach ($arr as $key => $value) {
        $str .= sprintf('"%s":', $this->sanitizeForJSON($key));

        if (is_array($value)) {
            $str .= '[';
            foreach ($value as &$val) {
                $val = $this->sanitizeForJSON($val);
            }
            $str .= '"' . implode('","', $value) . '"';
            $str .= ']';
        } else {
            $str .= sprintf('"%s"', $this->sanitizeForJSON($value));
        }

        $current ++;
        if ($current < $count) {
            $str .= ',';
        }
    }

    $str.= '}';

    return $str;
}

/**
 * @param string $str
 * @return string
 */
private function sanitizeForJSON($str)
{
    // Strip all slashes:
    $str = stripslashes($str);

    // Only escape backslashes:
    $str = str_replace('"', '\"', $str);

    return $str;
}
于 2016-05-12T09:57:38.553 に答える
1

この質問についての混乱を取り除くためだけに。答えはすでに見つかっており、問題の中にあります。

機能に問題はありませんjson_encode。すべての出力で正しく機能します。あなたの記憶と、スクリプトに与える記憶の量を除いて、そこに制限はありません。

問題は、ブラウザの<pre>タグの実装にありました。このタグに大きすぎる文字列を指定すると、何も出力されません。<pre>解決策は、タグなしで回答を出力することです

于 2013-10-03T10:47:59.700 に答える
0

これを試してください、

$arr = array();
for($i =0; $i<3000; $i++){
$arr[] = array(
    'name'  => 'test',
    'str'   => md5($i)
);
}
$contentArr = str_split(json_encode($arr), 65536);
foreach ($contentArr as $part) {
    echo $part;
}
于 2013-10-03T10:15:46.017 に答える