У меня странная проблема с Zend_Config_Xml.
Вот пример.
С помощью этого xml-файла https://gist.github.com/883465
этот код:
$config = new Zend_Config_Xml('config.xml'); var_dump($config->get('elements')->get('element')->toArray());
дает:
array(2) { [0]=> array(2) { ["a"]=> array(1) { ["attr"]=> string(2) "at" } ["e"]=> array(3) { [0]=> array(1) { ["attr"]=> string(2) "at" } [1]=> array(1) { ["attr"]=> string(2) "at" } [2]=> array(1) { ["attr"]=> string(2) "at" } } } [1]=> array(2) { ["a"]=> array(1) { ["attr"]=> string(2) "at" } ["e"]=> array(3) { [0]=> array(1) { ["attr"]=> string(2) "at" } [1]=> array(1) { ["attr"]=> string(2) "at" } [2]=> array(1) { ["attr"]=> string(2) "at" } } } }
с этим xml-файлом https://gist.github.com/883469
это дает:
array(2) { ["a"]=> array(1) { ["attr"]=> string(2) "at" } ["e"]=> array(3) { [0]=> array(1) { ["attr"]=> string(2) "at" } [1]=> array(1) { ["attr"]=> string(2) "at" } [2]=> array(1) { ["attr"]=> string(2) "at" } } }
и я ожидаю:
array(1) { [0]=> array(2) { ["a"]=> array(1) { ["attr"]=> string(2) "at" } ["e"]=> array(3) { [0]=> array(1) { ["attr"]=> string(2) "at" } [1]=> array(1) { ["attr"]=> string(2) "at" } [2]=> array(1) { ["attr"]=> string(2) "at" } } } }
Это сложно, если вы хотите перебирать элементы
$config = new Zend_Config_Xml('config.xml'); foreach($config->get('elements')->get('element') as $element);
который является прекрасным, если есть более одного элемента, но если у вас есть только один, вы закончите итерацию над дочерними элементами элемента!
Есть идеи?
РЕДАКТИРОВАТЬ:
Я придумал уродливое обходное решение:
if (0! == $ config-> get ('elements') -> get ('element')) {//}
Это помогает мне определить, существует ли более чем один элемент под тегом элементов.
Очень страшный.
Анитинг умнее?
Кажется, что Zend_Config_Xml явно сбрасывает такие одноэлементные коллекции (в исходном if
оператор if
). Возможные обходные пути:
get()
чтобы включить ваше уродливое обходное решение более чистым способом.