PHP JSON-декодирование: массив с проблемой $

У меня есть следующий JSON-файл в качестве входных данных,

{ "$type": "NanoWebInterpreter.WebInputData, NanoWebInterpreter", "NBBList": { "$type": "System.Collections.Generic.List`1[[monoTNP.Common.NBB, monoTNP.Common]], mscorlib", "$values": [ { "$type": "monoTNP.Common.NBB, monoTNP.Common", "ID": "id-0065-00000003", "MPList": { "$type": "System.Collections.Generic.List`1[[monoTNP.Common.MP, monoTNP.Common]], mscorlib", "$values": [ { "$type": "monoTNP.Common.EllipticalMP, monoTNP.Common", "Eccentricity": 1.0, "ID": "id-0065-00000006", "ParticleIndex": -1, "DispersionInteractionStrength": 0.0, "DispersionInteractionRange": 2.5, "CharacteristicSize": 0.0, "CenterOfMass": "<0,0,0>", "OrientationVector": "<>" }, { "$type": "monoTNP.Common.CubeMP, monoTNP.Common", "ID": "id-0065-00000005", "ParticleIndex": -1, "DispersionInteractionStrength": 0.0, "DispersionInteractionRange": 2.5, "CharacteristicSize": 0.0, "CenterOfMass": "<0,0,0>", "OrientationVector": "<>" }, { "$type": "monoTNP.Common.CircularMP, monoTNP.Common", "ID": "id-0065-00000004", "ParticleIndex": -1, "DispersionInteractionStrength": 0.0, "DispersionInteractionRange": 2.5, "CharacteristicSize": 0.0, "CenterOfMass": "<0,0,0>", "OrientationVector": "<>" } ] }, 

и т.п.

Моя конечная цель – проследить это дерево рекурсивно, обернув каждое имя ключа / объекта тегами <ul> и свойствами на уровне «ParticleIndex» в какой-то структуре <form> , но я не могу понять, как индексировать в два массива '$ values'.

Это код, который я манипулировал, чтобы узнать, как осуществляется доступ к каждому элементу (объекту или массиву):

 foreach ($json->NBBList->'$values'[0] as $key => $value){ var_dump($key); echo "\n".var_dump($value); echo "\n\n\n"; } 

Это явно не работает, потому что индекс значений находится за пределами строки, но когда он внутри, PHP интерпретирует его как часть строки.

Есть ли способ для меня индексировать каждый элемент массива «$ values» и, в конечном счете, в цикле for?

Я думаю, что использование «истинного» свойства декодирования JSON может быть лучшим решением …

Вы можете получить доступ к свойствам объекта с именами, которые содержат специальные символы, используя эту нотацию:

 $json->NBBList->{'$values'}[0] 

Я не думаю, что это поведение документировано в любом месте, но вы можете найти его в грамматике PHP (см. Определение variable_name , которое используется в object_dim_list , которое используется в object_property ).

Установите для параметра json_decode значение false для получения массивов (словарей) вместо объектов:

 $json = json_decode($jsonInput, true); foreach ($json['NBBList']['$values'][0] as $key => $value){ var_dump($key); echo "\n"; var_dump($value); echo "\n\n\n"; } 
 foreach($json->NBBList->{'$values'}[0] as $key=>$value){ 

Вы можете использовать фигурные скобки вокруг строки для доступа к свойствам объекта со специальными символами.

Вы что-то пробовали?

 $show_values = $values[0]; foreach ($json->NBBList->'$show_values' as $key => $value){ var_dump($key); echo "\n".var_dump($value); echo "\n\n\n"; 

Просто идея, я не уверен, насколько она будет работать