sum
中的xpath
- 函数:
<list>
<a>1</a>
<a>3</a>
<a>4</a>
</list>
现在使用SimpleXml
...
var_dump($xml->xpath("sum(/list/a)"));
提供NULL
而不是8
这里有什么问题?
看它不起作用:https://eval.in/135558
编辑:我已为SimpleXml
使用此解决方法来避免迭代:
$sum = $xml->xpath("/list/a");
$sum = array_sum(array_walk("intval", $sum));
答案 0 :(得分:3)
如果您正在使用SimpleXML,则必须手动执行此操作。但是,您可以使用DOMDocument来实现此目的。只需使用evaluate()
方法来评估XPath表达式:
$dom = new DOMDocument;
$dom->loadXML($xml); // $xml is the XML string
$xpath = new DOMXPath($dom);
$sum = (int) $xpath->evaluate('sum(/list/a)'); // => 8
SimpleXML解决方案:
$xml = simplexml_load_string($xml);
$sum = 0;
foreach ($xml->a as $node) {
$sum += (int) $node;
}
echo $sum; // => 8
答案 1 :(得分:1)
在此使用DOMXPath::evaluate()
:
$str = <<<XML
<list>
<a>1</a>
<a>3</a>
<a>4</a>
</list>
XML;
$output = new SimpleXMLElement($str);
$doc = new DOMDocument();
$doc->loadXML($str);
$selector = new DOMXPath($doc);
var_dump($selector->evaluate('sum(//list/a/text())'));
// double(8)
旁注:它会返回double
而不是integer
。这首先可能会令人惊讶。