Zend_Config_Xml奇怪的行为

时间:2011-03-24 06:44:10

标签: php xml arrays zend-framework config

我对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')){  // }

这有助于我确定元素标签下是否有多个元素。

非常难看。

更聪明地说?

1 个答案:

答案 0 :(得分:1)

似乎Zend_Config_Xml显式地折叠了这样的1元素集合(源代码中有if语句执行此操作)。一些可能的解决方法:

  • 重载Zend_Config_Xml并修复加载程序代码,使其不会折叠1个元素的集合
  • 重载Zend_Config_Xml并重载get()以更清晰的方式包含您丑陋的变通方法。
  • 使用SimpleXML代替Zend_Config_Xml