json_encode () в многомерном массиве – со строковыми ключами

Я создаю очень большой многомерный массив, используя 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 этого не делает.

У меня теперь есть рабочее решение, которое быстро и хорошо работает.

  1. Во-первых, как написано в ссылке SO из вопроса;

    В JSON массивы имеют только числовые ключи, тогда как объекты имеют строковые свойства. Включение ключа массива заставляет всю внешнюю структуру быть объектом по необходимости.

    В JSON; В фигурных скобках хранятся объекты ( {} ), квадратные скобки содержат массивы ( [] ).

  2. Поэтому использование строки в качестве ключа приведет к тому, что функция json_encode вернет объекты, тогда как перезапуск ключей обеспечит создание массивов.

  3. Поэтому перед тем, как я верну свою закодированную строку 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 позже. В любом случае, когда-нибудь кто-то может найти это полезным.