Помогите переписать функцию array_map

105
10 ноября 2021, 10:10

Есть json:

{
  "orderid": "1586202852",
  "products": [
    {
      "name": "ПРАЗДНИЧНЫЙ НАБОР",
      "quantity": "1",
      "amount": "2420",
      "price": "2420",
      "options": [
        {
          "option": "Храбрая открытка к твоему заказу",
          "variant": "Без открытки"
        },
        {
          "option": "ВЫБРАТЬ 1-ЫЙ ДЕСЕРТ В НАБОРЕ",
          "variant": "ХАЛВ ХОГАН"
        },
        {
          "option": "ВЫБРАТЬ 2-ОЙ ДЕСЕРТ В НАБОРЕ",
          "variant": "БРАУНИ С БЕКОНОМ, ВИШНЕЙ И МИНДАЛЕМ"
        },
        {
          "option": "ВЫБРАТЬ 3-ИЙ ДЕСЕРТ В НАБОРЕ",
          "variant": "БЛОНДИ С ОБЛЕПИХОЙ И БАЗИЛИКОМ"
        }
      ]
    },
    {
      "name": "БРАУНИ С КЛЮКВОЙ И ПЕРЕЧНОЙ МЯТОЙ",
      "quantity": "1",
      "amount": "750",
      "price": "750",
      "options": [
        {
          "option": "Веганский",
          "variant": "ДА"
        },
        {
          "option": "Храбрая открытка к твоему заказу",
          "variant": "Без открытки"
        }
      ]
    }
  ],
  "promocode": "ЗВОНОК",
  "discountvalue": "5%",
  "discount": "158.500",
  "subtotal": "3170",
  "amount": "3411.5"
}

Из этого json-а я формирую массив через array_map.

код:

$json=$value['products'];
if (isset($json[0]['options'][3]['option'])) {
                            $prod_mass=array_map( function($v) use ($domen_crm, $apikey_crm) { return ['quantity'=>$v['quantity'], 'offer'=>['id'=>namesku_to_id($v['name'],$domen_crm,$apikey_crm)], 'properties'=>[['name'=>$v['options'][0]['option'], 'value'=>$v['options'][0]['variant']],['name'=>$v['options'][1]['option'], 'value'=>$v['options'][1]['variant']],['name'=>$v['options'][2]['option'], 'value'=>$v['options'][2]['variant']],['name'=>$v['options'][3]['option'], 'value'=>$v['options'][3]['variant']]]]; }, $json);  
                        } elseif (isset($json[0]['options'][2]['option'])) {
                            $prod_mass=array_map( function($v) use ($domen_crm, $apikey_crm) { return ['quantity'=>$v['quantity'], 'offer'=>['id'=>namesku_to_id($v['name'],$domen_crm,$apikey_crm)], 'properties'=>[['name'=>$v['options'][0]['option'], 'value'=>$v['options'][0]['variant']],['name'=>$v['options'][1]['option'], 'value'=>$v['options'][1]['variant']],['name'=>$v['options'][2]['option'], 'value'=>$v['options'][2]['variant']]]]; }, $json); 
                        } elseif (isset($json[0]['options'][1]['option'])) {
                            $prod_mass=array_map( function($v) use ($domen_crm, $apikey_crm) { return ['quantity'=>$v['quantity'], 'offer'=>['id'=>namesku_to_id($v['name'],$domen_crm,$apikey_crm)], 'properties'=>[['name'=>$v['options'][0]['option'], 'value'=>$v['options'][0]['variant']],['name'=>$v['options'][1]['option'], 'value'=>$v['options'][1]['variant']]]]; }, $json);                        
                        } elseif (isset($json[0]['options'][0]['option'])) {
                            $prod_mass=array_map( function($v) use ($domen_crm, $apikey_crm) { return ['quantity'=>$v['quantity'], 'offer'=>['id'=>namesku_to_id($v['name'],$domen_crm,$apikey_crm)], 'properties'=>[['name'=>$v['options'][0]['option'], 'value'=>$v['options'][0]['variant']]]]; }, $json);
                        } else {
                            $prod_mass=array_map( function($v) use ($domen_crm, $apikey_crm) { return ['quantity'=>$v['quantity'], 'offer'=>['id'=>namesku_to_id($v['name'],$domen_crm,$apikey_crm)]]; }, $json);
                        }
  1. Подскажите, как обработать опции (options), их может быть 0-4 в каждом products. я пишу 'name'=>$v['options'][0]['option'], 'name'=>$v['options'][1]['option'], но мне нужно избавиться от прявязки к индексу.

  2. И второй вопрос, опций может не быть, как в array_map просто ничего не выводить если (options) нет

Answer 1

Если я правильно понял, то тут вообще все проще некуда (если я не так понял, то увы, объясните подробнее, что вы хотите):

$json = '{
  "orderid": "1586202852",
  "products": [
    {
      "name": "ПРАЗДНИЧНЫЙ НАБОР",
      "quantity": "1",
      "amount": "2420",
      "price": "2420",
      "options": [
        {
          "option": "Храбрая открытка к твоему заказу",
          "variant": "Без открытки"
        },
        {
          "option": "ВЫБРАТЬ 1-ЫЙ ДЕСЕРТ В НАБОРЕ",
          "variant": "ХАЛВ ХОГАН"
        },
        {
          "option": "ВЫБРАТЬ 2-ОЙ ДЕСЕРТ В НАБОРЕ",
          "variant": "БРАУНИ С БЕКОНОМ, ВИШНЕЙ И МИНДАЛЕМ"
        },
        {
          "option": "ВЫБРАТЬ 3-ИЙ ДЕСЕРТ В НАБОРЕ",
          "variant": "БЛОНДИ С ОБЛЕПИХОЙ И БАЗИЛИКОМ"
        }
      ]
    },
    {
      "name": "БРАУНИ С КЛЮКВОЙ И ПЕРЕЧНОЙ МЯТОЙ",
      "quantity": "1",
      "amount": "750",
      "price": "750",
      "options": [
        {
          "option": "Веганский",
          "variant": "ДА"
        },
        {
          "option": "Храбрая открытка к твоему заказу",
          "variant": "Без открытки"
        }
      ]
    }
  ],
  "promocode": "ЗВОНОК",
  "discountvalue": "5%",
  "discount": "158.500",
  "subtotal": "3170",
  "amount": "3411.5"
}';

Собираем через foreach:

$json = json_decode($json, true);
$json = $json['products'];
$products = [];
foreach ($json as $product) {
    $name = $product['name'] ?? '';
    $quantity = $product['quantity'] ?? '';
    $prod = [
        'quantity' => $quantity,
        'offer' => [
            'id' => namesku_to_id($name, $domen_crm, $apikey_crm)
        ]
    ];
    if (($options = $product['options'] ?? [])) {
         foreach ($options as &$option) {
             $option = [
                'name' => $option['option'],
                'value' => $option['variant']
             ];
         }
         $prod['properties'] = $options;
    }
    $products[] = $prod;
}
unset($product, $json);
var_dump($products);

Собираем через array_map:

$json = json_decode($json, true);
$json = $json['products'];
$products = [];
array_map(function($product) use(&$products, $domen_crm, $apikey_crm) {
    $name = $product['name'] ?? '';
    $quantity = $product['quantity'] ?? '';
    $prod = [
        'quantity' => $quantity,
        'offer' => [
            'id' => namesku_to_id($name, $domen_crm, $apikey_crm)
        ]
    ];
    if (($options = $product['options'] ?? [])) {
        $prod['properties'] = array_map(function($options) {
             return [
                'name' => $options['option'],
                'value' => $options['variant']
             ];
         }, $options);
    }
    $products[] = $prod;
}, $json);
unset($json);
var_dump($products);
READ ALSO
Загрузить изображение в base64 post-запросом на сайт с помощью nodejs и php

Загрузить изображение в base64 post-запросом на сайт с помощью nodejs и php

Как загрузить на сайт изображение в base64, отправив post-запрос с nodejs с именем изображения и самим base64?

81
Как реализовать очередь с приоритетом на PHP+Nginx?

Как реализовать очередь с приоритетом на PHP+Nginx?

Есть сервер, где выполняется обработка изображений и видеоОбращения к скрипту на сервере для обработки идут двух типов: от не авторизованных...

106
Классовый тип для работы со структурами типа "Вектор"

Классовый тип для работы со структурами типа "Вектор"

![На фото я уже использую готов Vector а мне нужно сделать собственный]11

202
Как обработать NullPointerException java?

Как обработать NullPointerException java?

Всем привет! Есть такой кусок кода

181