Гарантирует ли json_decode в PHP сохранение порядка элементов при возврате массива? - PullRequest
7 голосов
/ 19 июня 2009

Вы можете передать логическое значение json_decode для возврата массива вместо объекта

json_decode('{"foo", "bar", "baz"}', true);  // array(0 => 'foo', 1 => 'bar', 2 => 'baz')

Мой вопрос такой. При анализе литералов объектов это гарантирует, что порядок элементов будет сохранен? Я знаю, что свойства объекта JSON не упорядочены, но есть массивы PHP. Я не могу найти нигде в руководстве PHP, где это решается явно. Это, вероятно, оправдывает ошибку из-за осторожности, но я бы хотел, если возможно, не включать какое-то под-свойство «index».

Ответы [ 4 ]

4 голосов
/ 19 июня 2009

Не имеет ли больше смысла в этом случае использовать массив при передаче JSON в PHP. Если у вас нет ключей объекта в JSON (которые становятся ключами ассоциативного массива в PHP), просто отправьте его как массив. Таким образом, вам будет гарантировано, что в PHP они будут в том же порядке, что и в javascript.

json_decode('{["foo", "bar", "baz"]}');
json_decode('["foo", "bar", "baz"]'); //I think this would work

Если вам нужны ассоциативные массивы (именно поэтому вы передаете второй аргумент как true), вам придется придумать способ поддержать их порядок при передаче. После того, как вы расшифруете массив, вам нужно будет выполнить некоторую постобработку получившегося массива.

$json = '{[ {"key" : "val"}, {"key" : "val"} ]}';
json_decode($json, true);
1 голос
/ 19 июня 2009

Отсутствие явного утверждения Я бы сказал, что по определению не будет сохранен явный порядок.

Моя основная мысль заключалась в том, в каком порядке это будет сохраняться? Функция json_decode принимает строковое представление литерала объекта javascript в качестве аргумента, а затем возвращает либо объект, либо массив. Входные данные функции (литерал объекта в виде строки) не имеют явного упорядочения, что означает отсутствие четкого порядка для функции json_decode для поддержки.

1 голос
/ 19 июня 2009

Лично я никогда не доверял какой-либо системе возвращать точный заказ, если только этот заказ не определен специально. Если вам действительно нужен порядок, тогда используйте словарь, также известный как 2dimension массив, и присваивайте значение места (0,1,2,3 ...) каждому значению в списке.

Если вы примените это правило ко всему, вам никогда не придется беспокоиться о доставке / хранении этого массива, будь то XML, JSON или база данных.

Помните, что если что-то происходит определенным образом, это не значит, что это происходит намеренно. Это похоже на то, что у строк в базе данных есть порядок, хотя на самом деле их нет, если только вы не используете предложение ORDER BY. Небезопасно думать, что идентификатор 1 всегда стоит перед идентификатором 2 в SELECT.

1 голос
/ 19 июня 2009

Я несколько раз использовал json_decode (), и порядок результатов не менялся в клиентских приложениях PHP. Но с Python, например, он не сохраняет порядок.

Один из способов успокоиться - проверить его на нескольких примерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...