Как можно преобразовать XML в массив в PHP, при этом сохраняя все атрибуты?

Как можно преобразовать XML, полученный через API, так, чтобы атрибуты тега <image> правильно отображались в результирующем массиве, например, так:

<pre><code class="php">array(2) {
	["@attributes"]=&gt;
		array(1) {
			["tag"]=&gt;
			string(4) "plan"
		}
	["@text"]=&gt;
	string(36) "http://example.ru/photo/pid/BE72ABD7"
}</code></pre>?
  • 11 октября 2024 г. 9:35
Ответы на вопрос 2
Для преобразования XML в массив в PHP с сохранением всех атрибутов, можно использовать функцию `simplexml_load_string`, которая позволяет работать с XML, а затем преобразовать его в массив. В процессе конвертации атрибуты и текст содержимого элемента можно сохранить в виде отдельных ключей.

Вот пример того, как можно реализовать такую конвертацию:

```php
function xmlToArray($xml) {
    // Проверяем, что $xml является объектом SimpleXMLElement
    if (!($xml instanceof SimpleXMLElement)) {
        $xml = simplexml_load_string($xml);
    }

    // Инициализируем массив
    $array = [];

    // Извлекаем атрибуты
    if ($xml->attributes()) {
        $array['@attributes'] = [];
        foreach ($xml->attributes() as $attr => $value) {
            $array['@attributes'][$attr] = (string)$value;
        }
    }

    // Извлекаем текстовое содержимое
    if ($xml->count() === 0) {
        // Если у элемента нет дочерних узлов, берем текст
        $array['@text'] = (string)$xml;
    } else {
        // Если есть дочерние узлы, рекурсивно преобразуем их в массив
        foreach ($xml->children() as $child) {
            $array[] = xmlToArray($child);
        }
    }

    return $array;
}

// Пример XML
$xmlString = '<image tag="plan">http://example.ru/photo/pid/BE72ABD7</image>';

// Преобразуем XML в массив
$resultArray = xmlToArray($xmlString);

// Вывод результата
print_r($resultArray);
```

### Объяснение кода:
1. **Функция xmlToArray**: Эта функция принимает строку XML или объект SimpleXMLElement и создает соответствующий массив.
2. **Проверка и загрузка XML**: Если входной параметр не является объектом `SimpleXMLElement`, он будет загружен с помощью `simplexml_load_string`.
3. **Извлечение атрибутов**: Если у элемента есть атрибуты, они добавляются в массив под ключом `@attributes`.
4. **Извлечение текста**: Если элемент не имеет дочерних узлов, его текст сохраняется под ключом `@text`. Если дочерние узлы есть, рекурсивно вызывается функция для каждого дочернего узла.
5. **Печать результата**: Функция `print_r` используется для отображения полученного массива.

Таким образом, в результате вы получите массив, который будет содержать все атрибуты и текстовые данные из вашего XML.
Читать последовательно через https://www.php.net/manual/ru/book.xmlreader.php самому заполняя массив. Готовый код не дам, но там несложно.
Похожие вопросы