E
E
Evgeny Musonov2020-01-15 10:27:59
PHP
Evgeny Musonov, 2020-01-15 10:27:59

How to convert a piece of XML into a PHP associative array?

There is an XML file about 1 GB in size, which will probably increase in the future. In this XML, certain blocks need to be processed. Now I'm trying to make transformations to an array using XMLReader, but I can't figure out how to bypass nesting, that is, it's not stupid to write

$reader->read();
$var = $reader->localName;
$reader->read();
....

I would like to understand how to automate nesting bypass, and not do it manually.
I will be very grateful for your help.
The part I'm currently trying to convert
<Свойства>
      <Свойство>
        <Ид>b27961ab-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Наименование для сайта</Наименование>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961ad-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Тип</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>8f864cca-c3ee-11e9-b6d2-00016cd99202</ИдЗначения>
            <Значение>Люстры</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>6716ce9d-c4a6-11e9-b953-f44d3076153a</ИдЗначения>
            <Значение>Настенные</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>d8a3c853-c4ba-11e9-b953-f44d3076153a</ИдЗначения>
            <Значение>Напольные</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961ae-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Стиль</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>671e0b69-f7ac-11e3-8d3f-002522cd5395</ИдЗначения>
            <Значение>Современные</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>663f9c5b-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Лофт</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961af-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Производитель</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>671e0b68-f7ac-11e3-8d3f-002522cd5395</ИдЗначения>
            <Значение>Лунный Свет (Испания)</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b0-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Серия (групировка по арт.)</Наименование>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b1-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Фото 1</Наименование>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b2-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Фото 2</Наименование>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b3-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Фото 3</Наименование>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b4-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Фото 4</Наименование>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b5-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Фото 5</Наименование>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b6-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Рекомендуемая площадь освещённости</Наименование>
        <ТипЗначений>Число</ТипЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b7-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Тип ламп</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>671e0b6c-f7ac-11e3-8d3f-002522cd5395</ИдЗначения>
            <Значение>Светодиодные</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>663f9c6a-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Е14</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>663f9c6b-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Е27</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961b8-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Количество ламп (шт)</Наименование>
        <ТипЗначений>Число</ТипЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961ba-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Цвет арматуры_1</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>663f9c72-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Белый</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>663f9c7c-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Коричневый</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>663f9c73-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Хром</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>663f9c76-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Золото</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961bb-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Цвет плафона_1</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>c9f4043f-f832-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Прозрачный</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>671e0b70-f7ac-11e3-8d3f-002522cd5395</ИдЗначения>
            <Значение>Белый</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961bc-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Цвет аксессуаров</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>c9f40458-f832-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Прозрачный</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961bd-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Тип крепежа</Наименование>
        <ТипЗначений>Справочник</ТипЗначений>
        <ВариантыЗначений>
          <Справочник>
            <ИдЗначения>671e0b6b-f7ac-11e3-8d3f-002522cd5395</ИдЗначения>
            <Значение>Планка</Значение>
          </Справочник>
          <Справочник>
            <ИдЗначения>663f9c68-f82d-11e3-b27a-002522cd5395</ИдЗначения>
            <Значение>Корпусом</Значение>
          </Справочник>
        </ВариантыЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
      <Свойство>
        <Ид>b27961be-f7a3-11e3-8d3f-002522cd5395</Ид>
        <Наименование>Высота подвеса (мм)</Наименование>
        <ТипЗначений>Число</ТипЗначений>
        <ДляТоваров>true</ДляТоваров>
      </Свойство>
    </Свойства>

Answer the question

In order to leave comments, you need to log in

2 answer(s)
S
Sergey, 2020-01-15
@Ualde

The most primitive way is to use the json_encode-json_decode bundle

$obj = simplexml_load_file('test.xml'); 
// или (смотря что у вас на входе - файл или строка) $obj = simplexml_load_string($text); 
$json = json_encode($obj);
$array = json_decode($json, true);

K
Kirill Alekseev, 2020-01-15
@kspitfire

It is not very clear what you need to get in the end.
I can advise you to parse thick XML files using Symfony DOMCrawler . If you don’t fit in from memory, you can use the approach like here: Hybrid XML Parser .
Use recursion.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question