В PHP часто возникает задача создать XML из массива, например, для формирования фидов товаров, экспорта данных в сторонние системы или интеграции с CRM. Простого implode или json_encode для XML недостаточно — нужен правильный формат с поддержкой вложенных элементов, атрибутов и корректной кодировкой.
В этой статье мы разберём рекурсивную функцию array_to_xml, которая решает эту задачу гибко и надёжно.
Назначение функции
Функция array_to_xml позволяет:
- Преобразовывать любой многомерный массив PHP в XML.
- Поддерживать вложенные элементы и иерархию тегов.
- Добавлять атрибуты элементов через специальный ключ
_attributes. - Задавать значение элемента через ключ
_value. - Генерировать корректные теги для числовых и строковых ключей.
<?php
function array_to_xml($arrayPHP, &$xmlObj)
{
foreach ($arrayPHP as $key => $value) {
/* массив системных ключей */
$systemKeys = [
"_attributes",
"_value"
];
/* если значение — массив и не системный ключ */
if (is_array($value) && !in_array($key, $systemKeys)) {
/* создаём ключ для xml элемента */
if (strpos($key, "_elem") !== false) {
$arrKeys = explode(":", $key);
$codeTag = is_int($arrKeys[1]) ? "item" . $arrKeys[1] : $arrKeys[1];
} else {
$codeTag = is_int($key) ? "item" . $key : $key;
}
/* создаём элемент */
if (isset($value["_value"])) {
$subnode = $xmlObj->addChild($codeTag, $value["_value"]);
} else {
$subnode = $xmlObj->addChild($codeTag);
}
/* добавляем атрибуты для элемента */
if (isset($value["_attributes"])) {
foreach ($value["_attributes"] as $attrKey => $attrVal) {
$subnode->addAttribute($attrKey, $attrVal);
}
}
/* рекурсивно обрабатываем вложенные элементы */
array_to_xml($value, $subnode);
} elseif (!in_array($key, $systemKeys)) {
/* создаём ключ для xml элемента */
if (strpos($key, "_elem") !== false) {
$arrKeys = explode(":", $key);
$codeTag = is_int($arrKeys[1]) ? "item" . $arrKeys[1] : $arrKeys[1];
} else {
$codeTag = is_int($key) ? "item" . $key : $key;
}
$xmlObj->addChild($codeTag, htmlspecialchars($value));
}
}
}
/* создаём объект для XML */
$xml_user_info = new SimpleXMLElement('<?xml version="1.0"?><shop></shop>');
/* конвертируем PHP массив в XML код */
array_to_xml($users_array, $xml_user_info);
/* сохраняем результат в файл */
$xml_file = $xml_user_info->asXML('users.xml');
if ($xml_file) {
echo 'XML файл был успешно создан';
} else {
echo 'XML файл был создан с ОШИБКОЙ';
}
Как работает функция
Функция рекурсивно проходит массив:
- Проверяет ключ на служебные элементы (
_attributesи_value). - Генерирует корректный тег для XML:
- если ключ числовой — добавляет префикс
item. - если ключ содержит
_elem:— извлекает имя тега из строки.
- если ключ числовой — добавляет префикс
- Создаёт элемент XML через
SimpleXMLElement->addChild(). - Добавляет атрибуты, если они есть.
- Рекурсивно обрабатывает вложенные элементы.
- Обрабатывает обычные текстовые значения с
htmlspecialchars()для корректной кодировки XML.
Пример использования
$xml_user_info = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><shop></shop>');
array_to_xml($users_array, $xml_user_info);
$xml_user_info->asXML('users.xml');
После выполнения скрипта будет создан файл users.xml с таким содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<shop>
<item0 id="1">
<name>Иван</name>
<email>ivan@example.com</email>
</item0>
<item1 id="2">
<name>Мария</name>
<email>maria@example.com</email>
</item1>
</shop>
Преимущества функции
- Подходит для любых массивов PHP, включая сложные вложенные структуры.
- Позволяет добавлять атрибуты к любому элементу.
- Автоматически корректирует числовые ключи, чтобы XML был валидным.
- Проста в использовании и легко расширяется под любые задачи.
Рекомендации по использованию
- Всегда используйте UTF-8 при создании корневого XML.
- Для текстовых значений используйте
htmlspecialchars(), чтобы избежать ошибок с символами<,>и&. - Если массив очень большой — можно добавить отключение форматирования или сохранение по частям для экономии памяти.
- Функцию можно использовать для генерации XML-фидов, экспорта данных из CMS, интеграций с API и других задач.
Итог
Функция array_to_xml — это универсальный инструмент для конвертации массива PHP в XML с поддержкой атрибутов, вложенных элементов и корректной кодировки. Она позволяет создавать структурированные и валидные XML-файлы для любых целей: от экспорта товаров до интеграции с внешними системами.