I’ve been going back through all my old code and trying to optimize it. Something I recently stumbled across and that has gotten me stumped is trying to find an xpath solution for this:
function findit($search) {
$i=0;
foreach($xml as $page) { //loop to find specific $element based on $attribute
if($page['src']==$search) { return $i; }
$i++;
}
}
Needs to return $i so that it can be used for reference to the element in the XML later.
It seems like it should be possible, and I’ve found a few xpath strings that seem like they should work, but don’t. They usually refer to preceding-children and counting them through the xpath() function, but I can’t find the original sources anymore and don’t how to translate that to a PHP xpath string.
Is this even possible? Or is it any better/faster/efficient than what I’ve already got? Suggestions/Solutions?
EDIT: For Tandu’s Solution
Example of my XML File
<range>
<page src="attribute1" />
<page src="attribute2" />
etc...
<page src="attribut20" />
</range>
In my current PHP function, $i always returns 0 but should return whatever position $search is found at. Edited so it no longer needs to convert 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());
}
PHP has at least two (that I know of) methods for handling Xpath: the DOMXPath library, which works with DOMDocument, and SimpleXML, which has its own
xpath()method. If you want to evaluate actual expressions (such as getting the i in your example), you have to useDOMXPath::evaluate().SimpleXML::xpath()will only return a node list (as willDOMXPath::query(). There are alsoxpath_methods in php, but these seem to be functional versions of the other methods and still require DOM context node objects.I’m not sure what the
xmlin your example above is, but the example below uses DOMXPath. That I know of, there is no simple way to convertSimpleXMLtoDOMDocument. You’ll just have to load the xml separately.