1

Why can't I filter results on the attribute value rather than the index?

Something like this fails.

foreach ($portfolio->clientGroup[$id]->client['name=foo']->src as $src) { echo $src . '<br />'; } 

But this works.

foreach ($portfolio->clientGroup[$id]->client[0]->src as $src) { echo $src . '<br />'; } 
1

2 Answers 2

2

This does not work because SimpleXML is a lightweight implementation. Plus, you can't assume anything to work unless you have a specification.

You are looking for the xpath function of SimpleXMLElement objects, i.e.:

foreach ($portfolio->clientGroup[$id]->xpath("client[@name='foo']/src") as $src) { echo $src . '<br />'; } 
Sign up to request clarification or add additional context in comments.

3 Comments

Counter question: Are you sure that "name" isn't a child of <client>, instead of an attribute?
Yes ("Why can't I filter results on the attribute value rather than the index?")
Oops. Seems my browser font is too small. ;-) Whatever, I added an XPath expression for both cases to my answer. FWIW, +1 from me. Your answer was a few seconds faster than mine anyway.
1

SimpleXML provides access to your document in form of a nested array. There is no way to place an XPath expression as the array index.

Try something like:

$query = "client[@name='foo']/src"; // if name is an attribute $query = "client[name='foo']/src"; // if name is a child element foreach ($portfolio->clientGroup[$id]->xpath($query) as $src ) { echo $src . '<br />'; } 

2 Comments

Are you sure that "name" selects an attribute? Afaik, you need to prefix the name with an "@" sign.
The darn editor uses the "@" sign as some kind of shortcut for "Blockquote" or such. Everytime I press "@", it starts a new line, and I am forced to create the "@" somewhere else and copy/paste it in. Frustrating. Managed to get it wrong here.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.