Задача. Есть полученные через API данные, которые хранятся на сервере в JSON-формате. Нужно составить из них YML файл для передачи в Яндекс Бизнес

Введение
Для передачи данных в Яндекс Бизнес необходимо преобразовать их из JSON-формата в YML-файл. В данной статье описывается процесс преобразования данных, включая загрузку, обработку и сохранение в нужном формате.
Исходные данные
Исходные данные хранятся в JSON-формате и содержат информацию о ценах. Пример JSON-данных:
{
"prices": [
{
"filialId": 1,
"receptionId": 7,
"nomenclatureId": 208,
"name1C": "Название 1",
"nameA3": "",
"code1C": "246befa2-b0b9-11ec-bec8-0050569e8d43",
"businessId": 2,
"cost": 160
},
{
"filialId": 1,
"receptionId": 7,
"nomenclatureId": 212,
"name1C": "Название 2",
"nameA3": "",
"code1C": "246befa3-b0b9-11ec-bec8-0050569e8d43",
"businessId": 1,
"cost": 150
}
]
}
Перечень категорий
Категории, соответствующие параметру businessId
, хранятся в отдельном массиве:
$cat = [
'1' => 'Категория 1',
'2' => 'Категория 2',
'3' => 'Категория 3',
'4' => 'Категория 4',
];
Требования к YML-файлу
Требования к YML-файлу можно найти на странице поддержки Яндекс Бизнес. Примерный формат YML-файла:
<yml_catalog>
<shop>
<categories>
<category id="1">Категория 1</category>
<category id="2">Категория 2</category>
<category id="3">Категория 3</category>
</categories>
<offers>
<offer id="1">
<name>Название 1</name>
<vendor>Название_компании</vendor>
<price>13</price>
<currencyId>RUR</currencyId>
<categoryId>1</categoryId>
</offer>
<offer id="208">
<name>Название 2</name>
<vendor>Название_компании</vendor>
<price>160</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
</offer>
</offers>
</shop>
</yml_catalog>
Решение
Ниже приведен PHP-код, который выполняет преобразование данных из JSON в YML-файл:
<?php
$filePath = $_SERVER["DOCUMENT_ROOT"] . "/parse_data/all_prices/1_10.json";
// Извлечение данных из JSON-файла и преобразование в массив PHP
$jsonDataFromFile = file_get_contents($filePath);
$requestPrices = json_decode($jsonDataFromFile, true);
foreach ($requestPrices['prices'] as $price) {
$arPrice[$price['nomenclatureId']]['offer'] = $price['nomenclatureId'];
$arPrice[$price['nomenclatureId']]['businessId'] = $price['businessId'];
$arPrice[$price['nomenclatureId']]['vendor'] = 'Название_компании';
$arPrice[$price['nomenclatureId']]['name'] = $price['name1C'];
$arPrice[$price['nomenclatureId']]['code1C'] = $price['code1C'];
$arPrice[$price['nomenclatureId']]['cost'] = $price['cost'];
$arPrice[$price['nomenclatureId']]['currencyId'] = 'RUR';
}
$xml = new SimpleXMLElement('<yml_catalog/>');
$shop = $xml->addChild('shop');
$categories = $shop->addChild('categories');
$cat = [
'1' => 'Категория 1',
'2' => 'Категория 2',
'3' => 'Категория 3',
'4' => 'Категория 4',
];
// Добавляем категории
$businessIds = [];
foreach ($arPrice as $item) {
$businessId = $item['businessId'];
if (!in_array($businessId, $businessIds) && isset($cat[$businessId])) {
$category = $categories->addChild('category', $cat[$businessId]);
$category->addAttribute('id', $businessId);
$businessIds[] = $businessId;
}
}
$offers = $shop->addChild('offers');
// Добавляем предложения
foreach ($arPrice as $item) {
$offer = $offers->addChild('offer');
$offer->addAttribute('id', $item['offer']);
$offer->addChild('name', $item['name']);
$offer->addChild('vendor', $item['vendor']);
$offer->addChild('price', $item['cost']);
$offer->addChild('currencyId', $item['currencyId']);
$offer->addChild('categoryId', $item['businessId']);
}
// Сохраняем XML в файл
$xmlFilePath = $_SERVER["DOCUMENT_ROOT"] . "/xml_data/feed-1_10.xml";
$xml->asXML($xmlFilePath);
?>
Описание шагов
- Загрузка данных из JSON-файла: Указывается путь к JSON-файлу, содержащему данные о ценах. Данные из JSON-файла извлекаются и преобразуются в массив PHP с помощью функции
json_decode
. - Преобразование данных: Создается ассоциативный массив
$arPrice
, где ключами являютсяnomenclatureId
, а значениями — данные о предложениях (offer
), включаяbusinessId
,vendor
,name
,code1C
,cost
иcurrencyId
. - Создание XML-структуры: Инициализируется объект
SimpleXMLElement
для создания XML-документа. Добавляется корневой элемент<shop>
и его дочерние элементы<categories>
и<offers>
. - Добавление категорий: Создается массив
$cat
, содержащий соответствие междуbusinessId
и названиями категорий. Проходится по массиву$arPrice
, и для каждого уникальногоbusinessId
добавляется элемент<category>
в XML, если он существует в массиве$cat
. - Добавление предложений: Проходится по массиву
$arPrice
, и для каждого элемента добавляется элемент<offer>
в XML. Каждому элементу<offer>
добавляются дочерние элементы<name>
,<vendor>
,<price>
,<currencyId>
и<categoryId>
, заполняемые данными из массива$arPrice
. - Сохранение XML-файла: Сформированный XML-документ сохраняется в файл по указанному пути.
Этот процесс позволяет преобразовать данные из JSON в структурированный YML-файл, соответствующий требованиям Яндекс Бизнес.