Ямерт
The Old One
Помогите с алгоритмом
Есть такая задача:
Имея XML произвольной сложности, надо перегнать его данные в ассоциативный массив. При этом для упрощения примем, что ни у одного тэга нет атрибутов.
Т.е. принцип таков: имена тэгов -> имена элементов массива, значения тэгов -> значения этих элементов.
К примеру:
из XML:
....
<one>
<two>
<three>3</three>
</two>
</one>
....
надо получить массив $a, где, в частности, $a['one']['two']['three']==3
------------
Пока что я использовал xml_parse_into_struct(), а потом обрабатывал данные массива $values, но такой механизм работал максимум при 2-уровневой иерархии. Для 3-уровневой можно анализировать предыдущий тэг - является ли он родителем настоящего. Соответственно, чем дальше, тем хуже.
Вот сам код алгоритма (для двухуровневого XML, результат в массиве $arr):
Может, можно решить эту задачу проще средствами XML+XSLT (т.к. допускаю, что я выбрал не лучшее решение)?
Или может кто-то поможет изменить существующий алгоритм, сделав его универсальным?
Есть такая задача:
Имея XML произвольной сложности, надо перегнать его данные в ассоциативный массив. При этом для упрощения примем, что ни у одного тэга нет атрибутов.
Т.е. принцип таков: имена тэгов -> имена элементов массива, значения тэгов -> значения этих элементов.
К примеру:
из XML:
....
<one>
<two>
<three>3</three>
</two>
</one>
....
надо получить массив $a, где, в частности, $a['one']['two']['three']==3
------------
Пока что я использовал xml_parse_into_struct(), а потом обрабатывал данные массива $values, но такой механизм работал максимум при 2-уровневой иерархии. Для 3-уровневой можно анализировать предыдущий тэг - является ли он родителем настоящего. Соответственно, чем дальше, тем хуже.
Вот сам код алгоритма (для двухуровневого XML, результат в массиве $arr):
PHP:
for ($i=0; $i<$count_values; $i++)
{
if ($values[$i]['level']==1) continue;
if ($values[$i]['type']=="open")
{
$curr_tag = $values[$i]['tag'];
$arr[$curr_tag] = array();
}
else
if ($val['type']=="complete")
{
$arr[$curr_tag][$values[$i]['tag']] = $values[$i]['value'];
}
}
Или может кто-то поможет изменить существующий алгоритм, сделав его универсальным?