私はすべての古いコードを元に戻し、最適化しようとしています。私は最近、偶然見つけ、それは私が困惑得ているものは、このためのXPath解決策を見つけることを試みている:属性に基づいて特定の要素を見つける
function findit($search) {
$i=0;
foreach($xml as $page) { //loop to find specific $element based on $attribute
if($page['src']==$search) { return $i; }
$i++;
}
}
は、それが後のXMLの要素を参照するために使用することができるように$i
を返す必要があります。
これは可能なはずですが、動作するように見えるxpath文字列がいくつか見つかりましたが、そうではありません。彼らは通常、preceding-children
を参照して、xpath()
関数を介してそれらを数えますが、元のソースをもう見つけられず、それをPHP xpath文字列に変換する方法がありません。
これも可能ですか?それとも、それは私がすでに持っているものよりも優れている/速い/効率的ですか?提案/解決策?
EDIT:私の現在のPHP関数でTanduのソリューションについては
私のXMLファイルの例
<range>
<page src="attribute1" />
<page src="attribute2" />
etc...
<page src="attribut20" />
</range>
、$i
は常に0
を返しますがで発見されているものの位置$search
返す必要があります。編集して、simplexmlを変換する必要がなくなりました。
function findit($search) {
$dom=new DOMDocument('1.0');
$dom->load($file);
$xpath=new DOMXPath($dom);
$i=$xpath->evaluate("count(/range/page[@src='$search']/preceding-sibling::*)");
die($dom->saveXML());
}
関係者限り、私は彼の兄のDOM忘れのためのSimpleXMLを使用して! – mseancole
*入力が次の行に移動する代わりにコメントを追加することを認識していませんでしたXD 私のXMLは、もちろん、simplexmlです。これは私が持っているものですが、最もエレガントな方法であるかどうかはわかりませんが、まだ動作させることができません:( ここで正しくフォーマットできなかったのでオリジナルのポストにコードを追加しました:( – mseancole
@showerheadできますあなたのXMLを参照してください "ルート"と "子"はノード名です。たとえば、あなたが ' 'を代わりに使用している場合、私の例では "root"を "father"と "child"を "son"に置き換えます。私はあなたの質問の例で "子供"を使っているのを見ています。 –