Я пытаюсь использовать json_encode
в большом массиве, и результат ничего не возвращает (да, я проверил, что это utf-8). Когда я начал исследовать эту проблему, я обнаружил, что проблема возникает, когда строка становится больше, чем 65536.
Поэтому, когда мой массив имеет размер 1245, его строка из json_encode
имеет длину строки (65493), но когда я увеличиваю массив только на один, строка будет больше, чем 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>
является виновником … по какой-то причине он не печатает строку в моем браузере, но она есть.
Лоуренс, если хочешь, можешь просто написать его, и я буду считать его правильным. Потому что вы были причиной того, что я придумал это.
Просто чтобы устранить путаницу в этом вопросе. Ответ уже найден, и в этом вопрос.
В json_encode
нет ничего плохого. Он работает правильно для каждого выхода. Там нет ограничений, кроме вашей памяти, и сколько из них вы даете своему скрипту.
Проблема заключалась в реализации браузера тега <pre>
. Если вы предоставляете слишком большую строку этому тегу, он ничего не печатает. Таким образом, выход – вывод ответа без <pre>
У меня была та же проблема, и массив был настолько большим, что увеличение предела памяти не помогло решить мою проблему. Пришлось написать свой собственный 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; }
Пожалуйста, попробуйте это,
$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; }