Создать массив, перегруппировавший все возможности другого многомерного массива - PullRequest
0 голосов
/ 19 сентября 2018

У меня небольшие трудности с преобразованием массива, как я хочу, мне нужна помощь профессионалов.

У меня есть такой массив:

$inputs = array(
    'size' => array(
        's' => 's',
        'm' => 'm',
        'l' => 'l',
    ),
    'color' => array(
        'red' => 'red',
        'blue' => 'blue',
    ),
    'option' => 'option 1',
);

Из этих значений мне нужносоздайте массив, который объединит все возможности, например:

$possibilities = array(
    0 => array('size' => 's', 'color' => 'red', 'option' => 'option 1'),
    1 => array('size' => 'm', 'color' => 'red', 'option' => 'option 1'),
    2 => array('size' => 'l', 'color' => 'red', 'option' => 'option 1'),
    3 => array('size' => 's', 'color' => 'blue', 'option' => 'option 1'),
    4 => array('size' => 'm', 'color' => 'blue', 'option' => 'option 1'),
    5 => array('size' => 'l', 'color' => 'blue', 'option' => 'option 1'),

);

Я уточнил, что я нахожусь на Laravel, поэтому я могу использовать методы сбора ,но даже с помощью этих вспомогательных методов я не могу найти способ получить нужный массив $possibilities.

Исходный массив является динамическим (может иметь больше параметров с разными именами меток), поэтому мне нужно что-тоэто может работать независимо от размера массива и названия меток.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Пожалуйста, попробуйте это, я надеюсь, это поможет вам.

<?php

$inputs = array(
    'size' => array(
        's' => 's',
        'm' => 'm',
        'l' => 'l',
    ),
    'color' => array(
        'red' => 'red',
        'blue' => 'blue',
    ),
    'option' => 'option 1',
);
$combinations = [[]];
$length = count($inputs);

foreach (array_keys($inputs) as $key) {
    $tmp = [];
    foreach ($combinations as $v1) {
        if (is_array($inputs[$key])) {
            foreach ($inputs[$key] as $v2) {
                $tmp[] = array_merge($v1, [$key => $v2]);
            }
        } else {
            $tmp[] = array_merge($v1, [$key => $inputs[$key]]);
        }
    }
    $combinations = $tmp;
}
echo "<pre>";
print_r($combinations);

?>
0 голосов
/ 19 сентября 2018
$output = array();
foreach($inputs['size'] as $size)
{
    foreach($inputs['colour'] as $colour)
    {
        foreach($inputs['option'] as $option)
        {
            $output[] = array('size' => $size, 'colour' => $colour, 'option' => $option);
        }
    }
}
return $output;

Обновление:

$collection = collect($inputs[0]);
array_shift($inputs);
$matrix = $collection->crossJoin($inputs);
$matrix->all();

Обновление:

$collection = collect(array_shift($inputs));
$matrix = $collection->crossJoin($inputs);
$matrix->all();

Обновление:

используйте эту функцию

function combinations($arrays, $i = 0) {
    if (!isset($arrays[$i])) {
        return array();
    }
    if ($i == count($arrays) - 1) {
        return $arrays[$i];
    }

    // get combinations from subsequent arrays
    $tmp = combinations($arrays, $i + 1);

    $result = array();

    // concat each array from tmp with each element from $arrays[$i]
    foreach ($arrays[$i] as $v) {
        foreach ($tmp as $t) {
            $result[] = is_array($t) ? 
                array_merge(array($v), $t) :
                array($v, $t);
        }
    }

    return $result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...