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

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