Почему после преобразования xml в JSON пропадают атрибуты

Есть xml файл такого содержания (привожу часть кода):

<categories>
    <category id="336085411">НОВИНКИ</category>
    <category id="335086611">ВСЕ ТОВАРЫ</category>
    <category id="122129011">ПОСТЕЛЬНОЕ БЕЛЬЕ</category>
    <category id="341320011" parentId="122129011">КПБ НА РЕЗИНКЕ</category>
</categories>

И выполняю преобразование его в json следующим кодом:

$array = json_decode(json_encode( (array) simplexml_load_string($dataXML) ), 1);

В итоге я получаю такой массив:

0: НОВИНКИ
1: ВСЕ ТОВАРЫ
2: ПОСТЕЛЬНОЕ БЕЛЬЕ
3: КПБ НА РЕЗИНКЕ

А хотелось бы чтобы ключ массива равнялся id (category id)

Как возможно это реализовать?


Ответы (1 шт):

Автор решения: teran

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

$xml = simplexml_load_string($txt);

$result = [];
foreach($xml as $c){
    $id = (int) $c['id'];
    $result[$id] = (string) $c;
}

формально в вашем фрагменте кода при кодировании в json происходит что-то вида array_map($fn($c) => (string) $c) что на выходе дает просто текстовые значения узлов. Потом уже это кодируется в json и декодируется в массив. так что атрибутам тут появится неоткуда.

→ Ссылка