XPATH - получить единственное значение, возвращаемое вместо массива php - PullRequest
2 голосов
/ 19 сентября 2011

Я использую Xpath в PHP - я знаю, что мой запрос вернет либо 0, либо 1 результат.

Если возвращается 1 результат, я не хочу, чтобы он представлял собой массив - это то, что возвращается прямо сейчас. Я просто хочу получить значение без необходимости доступа к элементу [0] результата и приведению к строке.

Возможно ли это?

Ответы [ 5 ]

3 голосов
/ 19 сентября 2011

Если возвращается 1 результат, я не хочу, чтобы он был в виде массива - это то, что возвращается.Я просто хочу получить значение без необходимости доступа к элементу [0] результата и приведению к строке.

Это возможно с XPath's string function

Набор узлов преобразуется в строку, возвращая строковое значение узла в наборе узлов, который находится первым в порядке документов.Если набор узлов пуст, возвращается пустая строка.

и Метод evaluate DOMXPath:

Возвращает типизированный результат, есливозможно или 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 :

Функция положениявозвращает число, равное позиции контекста, из контекста вычисления выражения.

Пример:

$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 может быть получен множественный результат из-за способа вычисления выражения.

1 голос
/ 19 сентября 2011

Используя 'оценивать' вместо 'запрос' , вы можете выполнять такие вещи, как приведение.

Кроме того, если вас просто раздражает выполнение чего-либо много раз, просто напишите функцию, которая делает это ... в этом вся суть функций, верно?

0 голосов
/ 25 апреля 2013

Ваш вопрос предполагает, что вы используете SimpleXML, потому что вы говорите о массиве.Однако давным-давно вы приняли ответ с ответом DOMDocument.В любом случае, другие пользователи идут сюда в поисках решения в SimpleXML , которое работает немного по-другому:

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

Элемент в $first, если нет NULL (без элементов)тогда он по-прежнему будет иметь тип SimpleXMLElement (либо узел элемента, либо узел атрибута в зависимости от запроса xpath), однако вы можете просто привести его к строковому типу в PHP и сделать это или просто использовать его в строковом контексте * 1012.*, как с echo:

echo $first;
0 голосов
/ 19 сентября 2011

Вы можете написать это наиболее просто так:

$string = @$array[0];

Оператор @ будет подавлять ошибки, делая $string нулевым, если $array пусто.

0 голосов
/ 19 сентября 2011

вероятно

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

?

если $array[0] - массив, вы можете переименовать строку в new_array

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