Php json_encode возвращает разные значения на 2 разных серверах для одного и того же объекта

0

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

При использовании 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 в виде строки.

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

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

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

  • 2
    Сделайте var_dump чтобы более четко показать типы на входе. print_r любит скрывать эту информацию от вас. Возможно, ваш вклад отличается на двух машинах.
Теги:
arrays
nginx

1 ответ

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 сервера были согласованы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню