2017-01-16 10 views
0

xpath式を使用してforeachループを置き換えますが、複数のリストを返すにはDOMXPathオブジェクトが必要です。DOMXPathを使用してforeachループをXPath式に置き換えます。

私は、次のXML(簡体字)を持っていると私はそれを反復するためにDOMDocumentDOMXPathを使用して:

<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; 
} 

これは現在作業中ですが、私はforeachループをXpath式に置き換えたいと考えています。 $rooms = $this->xpath->query("//a:RoomsType/a:Rooms/a:Room[a:RPH='{$rph}']");の数字を$rphとすると数字が使えますが、RPHがわからないとどうすればいいですか(0から99の間であれば何でも構いません)。出来ますか?

つまり、XPathを使って私のforeachループを置き換える方法はありますか?

一部に彼らができる、私はregisterPhpFunctionsの使用およびカスタム関数を考えていたが、私は

+1

いいえ、まだ 'foeach'が必要です。グループをフェッチするには、ネストされた結果または可能な$ rph値を作成するためにルームを反復処理する必要があります。 – ThW

+0

ご意見ありがとうございます。だから私は私の元のアプローチにぴったりだった。私は改善のための新しいアイデアのためにこの質問を開いたままにしておきますが、あなたが望むならあなたのコメントを回答として投稿することができます。新しい提案がない場合は、正しいとマークします。 – James

答えて

1

するXPath 1.0式foreachループでノードのリストを返します比べてこのアプローチのパフォーマンスを懸念が平らに伸ばしますdescendantまたはancestorのような軸を使用する場合は既存の構造ですが、ノードのリストになります。それらをグループ化または集約することはできません。

特定のRPH値を持つノードのリストを取得できます。しかし、各値に対してこれを行う必要があります。結果は別のループになります。これは、すべてのRPHの値をフェッチし、それらを一意にし、反復して実行し、各値に対してXpath式を実行することを意味します。

現在のソリューションは問題ありません。

関連する問題