XPATH -获取返回的单个值而不是数组php


XPATH - get single value returned instead of array php

我在PHP中使用Xpath -我知道我的查询将返回0或1的结果。

如果返回1个结果,我不希望它作为一个数组-这是现在返回的。我只是想要这个值,而不需要访问结果的[0]元素并将其转换为字符串。

这可能吗?

如果返回1的结果,我不希望它作为一个数组-这是什么返回。我只是想要一个值,而不需要访问结果的[0]元素并强制转换为字符串。

这可以通过XPath的string函数

实现

通过返回节点集中按文档顺序排在前面的节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串。

和DOMXPath的evaluate方法:

返回一个类型化的结果(如果可能的话)或一个DOMNodeList,其中包含与给定XPath表达式匹配的所有节点。

例子:

$dom = new DOMDocument;
$dom->loadXML('<root foo="bar"/>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/@foo)')); // string(3) "bar"

如果有一个内置的xpath方法来抓取第一个且仅是第一个节点值,那么这将比编写函数更可取

您可以使用position函数:

position函数返回一个等于表达式求值上下文中的上下文位置的数字。

例子:

$dom = new DOMDocument;
$dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/foo[position() = 1]/@xml:id)')); // string(2) "f1"

或缩写语法

$dom = new DOMDocument;
$dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
$xp = new DOMXPath($dom);
var_dump($xp->evaluate('string(/root/foo[1]/@xml:id)')); // string(2) "f1"

请注意,当使用position函数查询//的后代时,由于表达式的求值方式可能会产生多个结果。

使用'evaluate'而不是'query',您可以执行诸如强制转换之类的操作。

  • DOMXPath::evaluate()

同样,如果你只是讨厌做很多次的事情,那就写一个函数来完成它…这就是函数背后的全部思想,对吧?

可能

if ($array[0]){
    $string = $array[0];
}

?

如果$array[0]是一个数组,可以将string重命名为new_array

if ($array[0]){
    $new_array  = $array[0];
}

您的问题表明您正在使用SimpleXML,因为您谈论数组。然而,很久以前你接受了一个答案,给出了DOMDocument的答案。在任何情况下,其他用户到这里寻找解决方案在SimpleXML它的工作方式有点不同:

list($first) = $xml->xpath('//element') + array(NULL);

$first中的元素如果不是NULL(对于没有元素),那么仍然将是SimpleXMLElement类型(根据xpath查询,可以是元素节点或属性节点),但是您可以将其在PHP中转换为字符串并完成,或者您只需在字符串上下文中使用它,就像 echo :

echo $first;

最简单的写法是:

$string = @$array[0];

@运算符将抑制错误,如果$array为空,则$string为空。