Помогите с алгоритмом

Ямерт

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):
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'];
        	}
}
Может, можно решить эту задачу проще средствами XML+XSLT (т.к. допускаю, что я выбрал не лучшее решение)?
Или может кто-то поможет изменить существующий алгоритм, сделав его универсальным?
 

slach

Новичок
я так понимаю что для парсинга XML используется стандрартный Expat ??? и ф-ции http://php.net/manual/en/ref.xml.php ???
дык вот они для этого не годяца особо
разве что внутри ф-ций которые ты объявил хандлерами (обработчиками) сделать переменную static $parent в которой держать родительсткий элемент массива...
но там тоже ниче хорошего не выйдет

я бы посоветовал юзать DOMXML (http://php.net/manual/en/ref.domxml.php
и потом одной ф-цией рекурсивно бегать по $DOMXMLNode->child_nodes() )

собственно там даже массив особо не нужен... все уже будет разложено до тебя...
 

Ямерт

The Old One
Есть один мааааленький нюанс - domxml есть экспериментальный. Неизвестно, как он будет развиваться дальше, что изменится, и т.д.
 

[DAN]

Старожил PHPClub
Не переживай, развивается он очень интенсивно. Видел бы ты его полгода назад.
Дальше он выйдет из разряда экспериментальных, и будет устанавливаться у всех хостеров. А изменяться будет лишь в сторону стандартов w3c.

Я не шучу.
 
Сверху