Извлечение значения цены в 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 или цикл, как показано выше.

Все предложенные методы являются корректными и позволяют получить искомое значение. Выбор зависит от ваших предпочтений и конкретного контекста использования.