XPATH – возвращает одно значение вместо массива php

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

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

Это возможно?

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

  • DOMXPath::evaluate()

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

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

Это возможно с помощью string функции XPath

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

и метод 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 :

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

вероятно

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

?

если $array[0] – массив, вы можете переименовать строку в 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]; 

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