我想使用xpath表达式替换foreach循环,但我需要一个DOMXPath对象来返回多个列表。
我有以下XML(简化版),我使用DOMDocument和DOMXPath来迭代它:
<a:RoomsType>
<a:Rooms>
<a:Room>
<a:RPH>0</a:RPH>
</a:Room>
<a:Room>
<a:RPH>1</a:RPH>
</a:Room>
<a:Room>
<a:RPH>2</a:RPH>
</a:Room>
<a:Room>
<a:RPH>0</a:RPH>
</a:Room>
<a:Rooms>
<a:RoomsType>
我想用RPH编号拆分房间,为每个RPH编号创建一个房间列表。目前,我使用以下代码:
//$xpath is a DOMXPath object
$roomsToIterate = $this->xpath->query("//a:RoomsType/a:Rooms/a:Room");
$roomList = array();
foreach ($roomsToIterate as $room) {
$rphCandidate = $room->getElementsByTagName("RPH")->item(0)->nodeValue;
if (!isset($roomList[$rphCandidate])) {
$roomList[$rphCandidate] = array();
}
$roomList[$rphCandidate][] = $room;
}
现在这个有用,但我想用Xpath表达式替换foreach循环。我可以使用$rooms = $this->xpath->query("//a:RoomsType/a:Rooms/a:Room[a:RPH='{$rph}']");
表达式$rph
作为数字,但如果我不知道RPH(如果它可能介于0到99之间),我怎么能这样做。有可能吗?
简而言之,有没有办法用XPath替换我的foreach循环?
我在考虑使用registerPhpFunctions和自定义函数,但是我关注这种方法与foreach循环相比的性能
答案 0 :(得分:1)
Xpath 1.0表达式将返回一个节点列表,如果使用像descendant
或ancestor
这样的轴,它们可以在某种程度上展平现有结构,但它将是一个节点列表。它不能分组或聚合它们。
您可以获取具有特定RPH
值的节点列表。但是你需要对每个值进行此操作,结果将是另一个循环。这意味着获取所有RPH
值,使它们唯一,迭代它们并执行每个值的Xpath表达式。
您当前的解决方案没问题。