Я использую 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
пуст.