2013-08-26 5 views
5

Я пытаюсь использовать json_encode на большом массиве, и результат ничего не возвращает (да, я проверил, что это utf-8). Когда я начал исследовать эту проблему, я обнаружил, что проблема возникает, когда строка становится больше, чем 65536.php json_encode большой массив

Итак, когда мой массив имеет размер 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>'; 

P.S. извините, ребята. Я нашел проблему, благодаря человеку с неподтвержденным именем :-) (спасибо вашему Лоуренсу). <pre> является виновником ... по какой-то причине он не печатает строку в моем браузере, но она есть.

Лоуренс, если хотите, вы можете просто написать его, и я приму его как правильно. Потому что вы были причиной того, что я придумал это.

+0

Пожалуйста, убедитесь, что сообщения об ошибках включена – HamZa

+1

Вы можете повторно воспроизвести поведение, в качестве примера. –

+0

Не печатает строку, но она на самом деле там? Теперь это даже странно. ': P' –

ответ

1

Просто, чтобы удалить путаницу этот вопрос. Ответ уже найден, и в этом вопрос.

Нет ничего плохого в функции json_encode. Он работает правильно для каждого выхода. Там нет ограничений, кроме вашей памяти, и сколько из них вы даете своему скрипту.

Проблема была в реализации браузера <pre> тега. Если вы предоставляете слишком большую строку этому тегу, он ничего не печатает. Таким образом, выход для вывода ответа без <pre> тег

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; 
} 
+0

Это не сработает. Массив слишком большой для json_encode. Вы пытаетесь плюнуть на него, когда он уже разбился –

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; 
} 
Смежные вопросы