PavelUstyugov
@PavelUstyugov
proger support

Как правильно распарсить xml в вложенностями и преобразовать в массив?

Есть такая структура вложенности. А мне нужно получить массив типа
$groups[
 [ 'id' => '05e26d88-01e4-11dc-a411-00055d80a2d1'
  'parentID' = > 'bd72d90d-55bc-11d9-848a-00112f43529a'
  'name' => 'Аксессуары],
 ....
];



<Группы>
			<Группа>
				<Ид>05e26d6f-01e4-11dc-a411-00055d80a2d1</Ид>
				<Наименование>Мебель</Наименование>
			</Группа>
			<Группа>
				<Ид>bd72d90d-55bc-11d9-848a-00112f43529a</Ид>
				<Наименование>Обувь</Наименование>
				<Группы>
					<Группа>
						<Ид>05e26d88-01e4-11dc-a411-00055d80a2d1</Ид>
						<Наименование>Аксессуары</Наименование>
					</Группа>
					<Группа>
						<Ид>bd72d90e-55bc-11d9-848a-00112f43529a</Ид>
						<Наименование>Женская обувь</Наименование>
					</Группа>
					<Группа>
						<Ид>dee6e1cf-55bc-11d9-848a-00112f43529a</Ид>
						<Наименование>Кроссовки</Наименование>
					</Группа>
					<Группа>
						<Ид>dee6e186-55bc-11d9-848a-00112f43529a</Ид>
						<Наименование>Мужская обувь</Наименование>
					</Группа>
				</Группы>
			</Группа>
		</Группы>


пытаюсь считать через simplexml_load_file но там придется вложенные циклы делать долгие. Уверен, что есть более рациональный способ. Неужели самому писать рекурсивную функцию?
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
roswell
@roswell
и швец, и жнец, и на дуде игрец
$groups = [];
$xml = simplexml_load_file('in.xml');
foreach ($xml->xpath('//Группа') as $group) {
    $parent = $group->xpath('parent::Группы/parent::Группа/Ид');
    $groups[] = [
        'id' => $group->{'Ид'}->__toString(),
        'name' => $group->{'Наименование'}->__toString(),
        'parentID' => count($parent) == 0 ? null : $parent[0]->__toString()
    ];
}
echo json_encode($groups);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
phpisgod
@phpisgod
Вложенные циклы здесь мало помогут, потому что вы не знаете всю глубину глубин групп.
А даже если сегодня предположить, что будет три уровня, то завтра их легко может быть четыре или пять.

Я так понял, это выгрузка из 1С и я такие 1Ски парсил с помощью рекурсии и SimpleXML. Тем более древовидная структура и наличие parentId в виде guid намекает, что нужно использовать рекурсию для этого.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SymbioWay Москва
от 120 000 до 180 000 ₽
АКМЭ сервис Санкт-Петербург
от 120 000 до 150 000 ₽
РосТендер Москва
от 130 000 до 150 000 ₽
15 авг. 2020, в 01:45
95000 руб./за проект
14 авг. 2020, в 22:47
15000 руб./за проект
14 авг. 2020, в 22:40
15000 руб./за проект