2013-08-26 21 views
5

Próbuję użyć json_encode na dużej tablicy, a wynik nie zwraca nic (tak, sprawdziłem, czy to jest utf-8). Kiedy zacząłem badać ten problem, odkryłem, że problem pojawia się, gdy ciąg staje się większy niż 65536.php json_encode duża tablica

Kiedy moja tablica ma rozmiar 1245, jej ciąg od json_encode ma długość sznurka (65493), ale kiedy zwiększam tablica po jednym, ciąg staje się dłuższy niż 65536, json_encode nie daje żadnego wyniku.

Myślałem, że problem jest z powodu memory limit, ale kiedy sprawdziłem mój php.ini widzę, że jest -1.

Każdy pomysł, co może być problemem?

zasadzie robię coś takiego:

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

PS: Przepraszam, chłopaki. Znalazłem problem, dzięki osobie o niepoprawnej nazwie :-) (dziękuję za Lawrence). <pre> jest winowajcą ... z jakiegoś powodu nie drukuje łańcucha w mojej przeglądarce, ale jest.

Lawrence, jeśli chcesz, możesz to napisać, a ja to zaakceptuję. Ponieważ byłeś powodem, dla którego to wymyśliłem.

+0

upewnij się, że raportowanie błędów jest włączona – HamZa

+1

można ponownie odtworzyć zachowanie, na przykład. –

+0

Nie drukuje łańcucha, ale tak naprawdę tam jest? Teraz jest jeszcze dziwniej. ': P' –

Odpowiedz

1

Wystarczy usunąć zamieszanie o tym mowa. Odpowiedź jest już znaleziona i jest w pytaniu.

Nie ma nic złego w funkcji json_encode. Działa poprawnie dla każdego wyjścia. Nie ma tu ograniczeń, z wyjątkiem twojej pamięci i tego, ile z niej dajesz skryptowi.

Problem polegał na implementacji przez przeglądarkę tagu <pre>. Jeśli podasz zbyt duży ciąg do tego znacznika, to nic nie wydrukuje. Tak więc wyjściem jest uzyskanie odpowiedzi bez znacznika <pre>

0

Spróbuj tego

$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

To nie zadziała. Tablica jest zbyt duża dla json_encode. Próbujesz go pluć, gdy już się rozbił –

1

Miałem ten sam problem i tablica była tak duża, że ​​zwiększenie limitu pamięci nie rozwiązało mojego problemu. Musiał napisać własny jsonEncode() -method do przezwyciężenia tego:

/** 
* 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; 
}