Задать вопрос

Каким образом преобразовать часть XML в ассоциативный массив PHP?

Есть XML файл размером около 1 ГБ, который в дальнейшем, возможно, будет увеличиваться. В этом XML надо обработать определенные блоки. Сейчас пытаюсь с помощью XMLReader сделать преобразования в массив, но не могу понять как обходить вложенности, то есть не тупо писать
$reader->read();
$var = $reader->localName;
$reader->read();
....

Хочется понять, как автоматизировать обход вложенности, а не делать это в ручную.
Буду очень благодарен за помощь.

Часть, которую сейчас пытаюсь преобразовать
<Свойства>
			<Свойство>
				<Ид>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</ДляТоваров>
			</Свойство>
		</Свойства>
  • Вопрос задан
  • 109 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@Ualde
Самый примитивный способ - использовать связку json_encode-json_decode
$obj = simplexml_load_file('test.xml'); 
// или (смотря что у вас на входе - файл или строка) $obj = simplexml_load_string($text); 
$json = json_encode($obj);
$array = json_decode($json, true);
Ответ написан
kspitfire
@kspitfire
Webdev: PHP (Symfony, Laravel), JS (Vue.js), Go.
Не очень понятно, что в итоге получить-то надо.
Могу посоветовать толстые XML-файлы парсить через Symfony DOMCrawler. Если по памяти будете не влезать — можно задействовать подход как тут: Hybrid XML Parser.

Хочется понять, как автоматизировать обход вложенности, а не делать это в ручную.


Использовать рекурсию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы