2015-01-20 2 views
0

У меня есть 2 сервера, каждый из которых работает с одним и тем же приложением, и у меня есть функция, возвращающая ответ json.Php json_encode возвращает разные значения на 2 разных серверах для одного и того же объекта

При использовании print_r($object) я получаю это на обоих серверах:

Array 
(
    [stats] => Array 
     (
      [6871] => 200 
     ) 

    [answers] => Array 
     (
      [0] => 7171 
     ) 

) 

Когда я использую json_encode($object); я получаю это:

для сервера A:

{"stats":{"6871":200},"answers":["7171"]} 

для сервера B:

{"stats":{"6871":200},"answers":[7171]} 

Таким образом, один сервер кодирует целочисленное значение answers как строку.

Серверы работают:

  • убунту
    • сервер А: Ubuntu 14.04.1 LTS
    • сервер В: Ubuntu 13.10
  • Nginx
    • сервер А: nginx/1.6.2
    • сервер В: Nginx/1.5.12
  • PHP-FPM
    • сервер А: РНР 5.5.9
    • сервер В РНР 5.5.3

И Nginx. файлы conf идентичны. Я не могу понять, где проблема, и я сижу на это часами, у кого-нибудь есть мысли?

+1

Сделайте «var_dump», чтобы более четко показать типы на входе. 'print_r' любит скрывать эту информацию от вас. Возможно, ваш вход отличается от двух машин. – cHao

ответ

0

print_r() функция не точно представляют типы данных:

<?php 

$string_values = array(
    'stats' => array (
     6871 => '200' 
    ), 
); 

$numeric_values = array(
    'stats' => array (
     6871 => 200, 
    ), 
); 


print_r($string_values); 
print_r($numeric_values); 

... будет печатать один и тот же выход дважды:

Array 
(
    [stats] => Array 
     (
      [6871] => 200 
     ) 

) 
Array 
(
    [stats] => Array 
     (
      [6871] => 200 
     ) 

) 

Вы бы лучше переключиться на var_dump():

var_dump($string_values, $numeric_values); 
array(1) { 
    ["stats"]=> 
    array(1) { 
    [6871]=> 
    string(3) "200" 
    } 
} 
array(1) { 
    ["stats"]=> 
    array(1) { 
    [6871]=> 
    int(200) 
    } 
} 
+0

Спасибо, все еще не знаю ПОЧЕМУ 2 сервера возвращают разные типы данных, но ваше предложение помогло мне понять, где вставлено строковое значение, и я использовал intval(), чтобы всегда принудительно его приводить, чтобы 2 сервера были согласованы – keepevets

Смежные вопросы