Извлечение значения цены в RUB из XML-структуры на PHP
Имеется XML-структура, представленная объектом SimpleXMLElement. Необходимо извлечь значение цены, соответствующее валюте RUB (в данном случае это 1090).
Исходная структура данных (упрощённо):
- Объект
productсодержит объектprices. - Внутри
pricesнаходится объектdefault. - Объект
defaultсодержит массивprice. - Каждый элемент массива
price- это объект с полямиcurrency(валюта) иprice(значение).
Попытка использовать XPath-запрос $xml->product->prices->default->price->xpath('price[@currency="RUB"]') не увенчалась успехом, так как обращение идёт не к тому уровню.
Решение на PHP
Поскольку $xml->product->prices->default->price является массивом объектов, необходимо найти в нём элемент, у которого свойство currency равно "RUB", и затем получить его свойство price.
Вот несколько корректных и элегантных способов:
Способ 1: Использование цикла foreach
Простейший и наглядный метод:
$prices = $xml->product->prices->default->price;
$rubPrice = null;
foreach ($prices as $priceItem) {
if ((string)$priceItem->currency == 'RUB') {
$rubPrice = (string)$priceItem->price;
break;
}
}
// $rubPrice теперь содержит "1090"Способ 2: Использование XPath на правильном уровне
XPath-запрос нужно применять к узлу, который является родителем для искомых элементов price. В данном случае это узел default:
$result = $xml->product->prices->default->xpath('.//price[@currency="RUB"]');
if (!empty($result)) {
$rubPrice = (string)$result[0]->price;
}
// $rubPrice теперь содержит "1090"Способ 3: Функциональный подход (аналог filter() в JS)
В PHP можно использовать функции для работы с массивами, предварительно преобразовав SimpleXMLElement в массив или используя итератор. Однако для SimpleXML часто удобнее использовать XPath или цикл, как показано выше.
Все предложенные методы являются корректными и позволяют получить искомое значение. Выбор зависит от ваших предпочтений и конкретного контекста использования.