Каждый элемент одного ключа массива соответствует каждому элементу других ключей массива

131
19 августа 2021, 15:20

уже второй день голову ломаю как решить данную проблему. Поиск к сожалению ничего не дает (может ищу неправильно). Задача следующая:

Массив с данными:

[19811] => Array
    (
        [Цветовая температура (K)] => Array
            (
                [0] => 3000
                [1] => 4000
            )
        [Угол светораспределения] => Array
            (
                [0] => 15°
                [1] => 30°
                [2] => 50°
            )
        [Цвет корпуса] => Array
            (
                [0] => белый
                [1] => серый
                [2] => черный
            )
    )

Кол-во элементов во втором массиве и названия ключей произвольные, например в этом их 3 (температура, светораспределения, цвет). Могут быть любые название и любое кол-во элементов, например:

[19811] => Array (

    [Мощность] => Array
        (
            [0] => 50
            [1] => 60
        )
    [Цвет корпуса] => Array
        (
            [0] => белый
            [1] => серый
            [2] => черный
        )
)

Получается что может быть как 1 ключ, так и несколько с разными названиями. Кол-во элементов в каждом ключе тоже произвольное.

Задача в следующем, нужно чтобы каждому элементу соответствовали все элементы следующих ключей т.е. берем кол-во вариаций температура (2)* угол(3) * цвет(3), получается 18 вариаций вида:

[Цветовая температура (K)] => 3000
[Угол светораспределения] => 15
[Цвет корпуса] => белый

Следующий:

[Цветовая температура (K)] => 3000
[Угол светораспределения] => 15
[Цвет корпуса] => Серый

и тд, последний:

[Цветовая температура (K)] => 4000
[Угол светораспределения] =>  50°
[Цвет корпуса] => Черный

Каким образом это можно сделать на PHP. Заранее спасибо если сможете помочь. Важна реализация именно на PHP

Answer 1

Благодаря splash58 (гигансткий плюс ему к карме) был найден правильный ответ, вот код функции которая возвращает нужный массив.

function cartesian(array $input)
{
    $result = [[]];
    foreach ($input as $key => $values) {
        $append = [];
        foreach ($values as $value) {
            foreach ($result as $data) {
                $append[] = $data + [$key => $value];
            }
        }
        $result = $append;
    }
    return $result;
}

Подробное обсуждение видно тут, там же есть и другие варианты

Answer 2
<?php
$arr = array(
  '19811'=> array(
    'Цветовая температура (K)' => array(
      '0' => '3000',
      '1' => '4000'
    ),
    'Угол светораспределения' => array(
      '0' => '15°',
      '1' => '30°',
      '2' => '50°'
    ),
    'Цвет корпуса' => array(
      '0' => 'белый',
      '1' => 'серый',
      '2' => 'черный'
    )
  )
);
foreach ($arr as $key => $value) {
  # code...
  for ($i = 0; $i <3 ; $i++) {
    # code...
    foreach ($value['Цвет корпуса'] as $key0 => $value1) {
      # code...
      $data[] = array(
        'id' => $key,
        'НАЗВАНИЕ' => 'TOP LED Lens 13W',
        'Тип источника света' => 'Светодиод (LED)',
        'Мощность (Вт)' => '13',
        'Световой поток (lm)' => '1470',
        'Цена' => '0',
        'Цветовая температура (K)' => $value['Цветовая температура (K)'][$i],
        'Угол светораспределения' =>  $value['Угол светораспределения'][$i],
        'Цвет корпуса' => $value1
      );
    }
  }
}
print_r($data);

примерно так

READ ALSO
Regex в условиях MySQL запроса

Regex в условиях MySQL запроса

В PHP использую :

313
Imagick не читает svg

Imagick не читает svg

Почему он не читает svg?

206
аналог конструкции &ldquo;? :&rdquo; (java) на python-3.x

аналог конструкции “? :” (java) на python-3.x

в Java есть такая конструкция:

162