强制SimpleXML节点始终是一个数组,即使它只有一个元素

时间:2011-08-19 15:49:29

标签: php xml simplexml

假设我想要一个地方有一个电话号码列表。 有些地方会有1个电话号码,有些会有不止一个。其他人根本就没有。

问题在于:

$xml->addChild('phone_number','555.555.5555');

创建一个不可迭代的phone_number文本节点:

$response->xml->phone_number;

但是这个:

$xml->addChild('phone_number','555.555.5555');
$xml->addChild('phone_number','555.555.5556');

创建一个可迭代的phone_number数组:

$response->xml->phone_number[0];
$response->xml->phone_number[1];

这给客户带来了不必要的负担。他们必须检测结果是否可迭代,并相应地修改其代码。

如果我总能发回一个可交换的数组,即使它中有0或1个项目,那将会更好......但是我还没有找到任何关于如何执行此操作的文档。在Perl中,我相信它被称为“forcearray”,但我还没有找到PHP的等价物,这是我需要的。

2 个答案:

答案 0 :(得分:3)

不要使用这个花哨的魔术界面($obj->xml->phone_number[x])并使用SimpleXMLElement::children() method,它总是返回可迭代对象。

答案 1 :(得分:2)

你应该考虑这个

<phone_numbers>
  <phone_number>555.555.5555</phone_number>
</phone_numbers>

这更灵活

children()方法旁边,您还可以考虑xpath
总是会产生一个要返回的数组

例如

$xml = <<<XML
<person>
  <phone_numbers>
    <phone_number>555.555.5555</phone_number>
  </phone_numbers>
</person>
XML;

$obj  = simplexml_load_string($xml);
$tels = $obj->xpath("//phone_numbers/*");

/* even more simple */
$tels = $obj->phone_numbers->children();