@danforth

Как сделать комбинацию значений из двух массивов?

Есть такой массив:
$features = array(
3 => array(
      1 => 1,
      2 => 1,
      3 => 1,
    ),
    5 => array(
      815 => 1,
      816 => 1,
      817 => 1,
    ),
);

на единицу в качестве значения внимания не обращайте.

На выходе должен получить массив из комбинаций ключей всех массивов, а именно:
3:1;5:815;
3:1;5:816;
3:1;5:817;
3:2;5:815;
3:2;5:816;
3:2;5:817;
3:3;5:815;
3:3;5:816;
3:3;5:817;

Сначала склеиваем ключ и один из ключей значения через двоеточие, в конце конкатенируем с точкой запятой.
В принципе, неважен сам порядок, главное не менять местами 3 и 5.
Upd: если в первоначальном массиве $features только один массив, тогда делаем комбинацию из его ключей вот так:
3:1;
3:2;
3:3;
  • Вопрос задан
  • 433 просмотра
Решения вопроса 1
// рекурсивно создать варианты для каждого корневого ключа
function create_variants($arr)
{
    $items = [];
    foreach ($arr as $key => $value) {
        $vars = [$key];
        if (!is_array($value)) {
            $items[] = implode(';', $vars);
            continue;
        }

        $variants = create_variants($value);
        foreach ($variants as $variantValue) {
            $items[] = implode(';', array_merge($vars, [$variantValue]));
        }
    }

    return $items;
}

/**
 * объединить варианты корневых ключей
 * @param $partsCount количество объединяемых в одно вариантов
 */
function join_variants($items, $partsCount)
{
    $result = [];
    $joinable = array_chunk($items, ceil(count($items)/$partsCount));

    foreach ($joinable as $chunk) {
        foreach ($chunk as $index => $item) {
            if (isset($result[$index])) {
                $result[$index] .= ';'.$item;
            } else {
                $result[$index] = $item;
            }
        }
    }

    return array_map(function ($v) {
        return $v.';';
    }, $result);
}

var_dump(join_variants(
    create_variants($features),
    count($features)
));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Рекурсия(0,"")

function Рекурсия(Level, Строка)
Если Level>колво_массивов, то выдать текущее значение строки
иначе цикл по кол-ву элементов в массиве:
- Рекурсия(Level+1, Строка+";"+"имя_массива"+":"+"значение_элемента")
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы