Я создаю очень большой многомерный массив, используя PHP. Каждый объект содержит Name, ID, ParentID и Children. Дети представляют собой массив из нескольких объектов в том же формате.
Очень важно назвать идентификаторы каждого объекта – это помогает мне помещать каждый объект под правильным родителем. (В приведенном ниже коде я использую 101, 102 и т. Д.),
Однако проблема заключается в том, что я возвращаю массив в JSON с помощью json_encode
. Каждый массив «Дети» печатается как объект, а не массив, как показано в коде JSON ниже.
Поскольку я читаю на другой SO-поток здесь , они «создаются как объекты из-за включения строковых ключей» – хотя они являются числами, они все еще являются строками.
{ "101": { "ID": "101", "ParentID": "0", "Name": "Root One" "Children": { "102": { "ID": "102", "ParentID": "101", "Name": "Child One" }, "103": { "ID": "103", "ParentID": "101", "Name": "Child Two", "Children": { "104": { "ID": "104", "ParentID": "103", "Name": "Child Child One" } } },
Кто-нибудь знает, как преодолеть эту проблему?
Изменить: JSON должен выглядеть так (квадратные скобки важны!):
[ { "ID": "101", "ParentID": "0", "Name": "Root One", "Children": [ { "ID": "102", "ParentID": "101", "Name": "Child One", "Children": [
В массиве JSON нет явных индексов, это просто упорядоченный список . Единственной структурой данных JSON, которая имеет именованные ключи, является объект. Литерал должен сделать это совершенно очевидным:
["foo", "bar", "baz"]
Этот массив не имеет именованных индексов, и нет никаких условий для добавления каких-либо.
PHP объединяет списки и хранилища ключей в один тип данных array
. JSON этого не делает.
У меня теперь есть рабочее решение, которое быстро и хорошо работает.
Во-первых, как написано в ссылке SO из вопроса;
В JSON массивы имеют только числовые ключи, тогда как объекты имеют строковые свойства. Включение ключа массива заставляет всю внешнюю структуру быть объектом по необходимости.
В JSON; В фигурных скобках хранятся объекты ( {}
), квадратные скобки содержат массивы ( []
).
Поэтому использование строки в качестве ключа приведет к тому, что функция json_encode
вернет объекты, тогда как перезапуск ключей обеспечит создание массивов.
Поэтому перед тем, как я верну свою закодированную строку JSON, я запустил функцию для сброса всех ключей массива. Код, который я нашел в этом потоке SO (сбросить ключи массива в многомерном массиве), был особенно полезен!
http://php.net/manual/en/function.json-decode.php
Установите 2-й параметр json_decode в значение true, чтобы получить доступ к массивам.
Помимо этого: javascript не может обрабатывать индексы без последовательных / несмежных массивов, поэтому, как только идентификаторы не являются последовательными, json не имеет другого варианта, чтобы преобразовать его в «строковые» индексы.
Это ваш объект:
$parent=new StdClass(); $parent->ID=101; $parent->ParentID=0; $parent->Name='Root One'; $child1=new StdClass(); $child1->ID=1011; $child1->ParentID=$parent->ID; $child1->Name='Child One'; $parent->Children[]=$child1; $child1_1=new StdClass(); $child1_1->ID=10111; $child1_1->ParentID=$child1->ID; $child1_1->Name='Child One One'; $child1->Children[]=$child1_1;
,$parent=new StdClass(); $parent->ID=101; $parent->ParentID=0; $parent->Name='Root One'; $child1=new StdClass(); $child1->ID=1011; $child1->ParentID=$parent->ID; $child1->Name='Child One'; $parent->Children[]=$child1; $child1_1=new StdClass(); $child1_1->ID=10111; $child1_1->ParentID=$child1->ID; $child1_1->Name='Child One One'; $child1->Children[]=$child1_1;
,$parent=new StdClass(); $parent->ID=101; $parent->ParentID=0; $parent->Name='Root One'; $child1=new StdClass(); $child1->ID=1011; $child1->ParentID=$parent->ID; $child1->Name='Child One'; $parent->Children[]=$child1; $child1_1=new StdClass(); $child1_1->ID=10111; $child1_1->ParentID=$child1->ID; $child1_1->Name='Child One One'; $child1->Children[]=$child1_1;
,$parent=new StdClass(); $parent->ID=101; $parent->ParentID=0; $parent->Name='Root One'; $child1=new StdClass(); $child1->ID=1011; $child1->ParentID=$parent->ID; $child1->Name='Child One'; $parent->Children[]=$child1; $child1_1=new StdClass(); $child1_1->ID=10111; $child1_1->ParentID=$child1->ID; $child1_1->Name='Child One One'; $child1->Children[]=$child1_1;
,$parent=new StdClass(); $parent->ID=101; $parent->ParentID=0; $parent->Name='Root One'; $child1=new StdClass(); $child1->ID=1011; $child1->ParentID=$parent->ID; $child1->Name='Child One'; $parent->Children[]=$child1; $child1_1=new StdClass(); $child1_1->ID=10111; $child1_1->ParentID=$child1->ID; $child1_1->Name='Child One One'; $child1->Children[]=$child1_1;
Это ваша функция преобразования JSON:
echo json_encode($parent,JSON_PRETTY_PRINT);
и это ваш объект, закодированный в формате JSON:
{ "ID": 101, "ParentID": 0, "Name": "Root One", "Children": [ { "ID": 1011, "ParentID": 101, "Name": "Child One", "Children": [ { "ID": 10111, "ParentID": 1011, "Name": "Child One One" } ] } ] }
Ответ наступил позже, потому что я начал изучать PHP позже. В любом случае, когда-нибудь кто-то может найти это полезным.