@maxyc_webber
Web-программист

Как собрать комбинацию вариантов массивов?

Давно было. уже не помню даже что искать.
нашел такие варианты https://github.com/drupol/phpermutations
https://github.com/pear/Math_Combinatorics/blob/tr...

но это не совсем то. тут один одномерный массив и кол-во вариантов указываешь.

у меня задача немного другая.

на входе любое кол-во массивов. надо сгенерировать их комбинации
например, два массива
[1,2],[3,4]
должно получиться
[1,3]
[1,4]
[2,3]
[2,4]

пример с тремя массивами
[1,2],[3,4],[5,6]
должно получиться
[1,3,5]
[1,3,6]
[1,4,5]
[1,4,6]
[2,3,5]
[2,3,6]
[2,4,5]
[2,4,6]
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
glaphire
@glaphire Куратор тега PHP
PHP developer
Была похожая задача, отрефакторила этот код под свои нужды
https://gist.github.com/fabiocicerchia/4556892
/**
 * Generate all the possible combinations among a set of nested arrays.
 *
 * @param array $data  The entrypoint array container.
 * @param array $all   The final container (used internally).
 * @param array $group The sub container (used internally).
 * @param mixed $val   The value to append (used internally).
 * @param int   $i     The key index (used internally).
 */
function generate_combinations(array $data, array &$all = array(), array $group = array(), $value = null, $i = 0)
{
    $keys = array_keys($data);
    if (isset($value) === true) {
        array_push($group, $value);
    }

    if ($i >= count($data)) {
        array_push($all, $group);
    } else {
        $currentKey     = $keys[$i];
        $currentElement = $data[$currentKey];
        foreach ($currentElement as $val) {
            generate_combinations($data, $all, $group, $val, $i + 1);
        }
    }

    return $all;
}

$data = array(
    array('a', 'b'),
    array('e', 'f', 'g'),
    array('w', 'x', 'y', 'z'),
);

$combos = generate_combinations($data);
print_r($combos);
//===
//output
//===
/*
Array
(
    [0] => Array
        (
            [0] => a
            [1] => e
            [2] => w
        )
 
    [1] => Array
        (
            [0] => a
            [1] => e
            [2] => x
        )
 
    [2] => Array
        (
            [0] => a
            [1] => e
            [2] => y
        )
 
    [3] => Array
        (
            [0] => a
            [1] => e
            [2] => z
        )
 
    [4] => Array
        (
            [0] => a
            [1] => f
            [2] => w
        )
 
    [5] => Array
        (
            [0] => a
            [1] => f
            [2] => x
        )
 
    [6] => Array
        (
            [0] => a
            [1] => f
            [2] => y
        )
 
    [7] => Array
        (
            [0] => a
            [1] => f
            [2] => z
        )
 
    [8] => Array
        (
            [0] => a
            [1] => g
            [2] => w
        )
 
    [9] => Array
        (
            [0] => a
            [1] => g
            [2] => x
        )
 
    [10] => Array
        (
            [0] => a
            [1] => g
            [2] => y
        )
 
    [11] => Array
        (
            [0] => a
            [1] => g
            [2] => z
        )
 
    [12] => Array
        (
            [0] => b
            [1] => e
            [2] => w
        )
 
    [13] => Array
        (
            [0] => b
            [1] => e
            [2] => x
        )
 
    [14] => Array
        (
            [0] => b
            [1] => e
            [2] => y
        )
 
    [15] => Array
        (
            [0] => b
            [1] => e
            [2] => z
        )
 
    [16] => Array
        (
            [0] => b
            [1] => f
            [2] => w
        )
 
    [17] => Array
        (
            [0] => b
            [1] => f
            [2] => x
        )
 
    [18] => Array
        (
            [0] => b
            [1] => f
            [2] => y
        )
 
    [19] => Array
        (
            [0] => b
            [1] => f
            [2] => z
        )
 
    [20] => Array
        (
            [0] => b
            [1] => g
            [2] => w
        )
 
    [21] => Array
        (
            [0] => b
            [1] => g
            [2] => x
        )
 
    [22] => Array
        (
            [0] => b
            [1] => g
            [2] => y
        )
 
    [23] => Array
        (
            [0] => b
            [1] => g
            [2] => z
        )
)
*/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@maxyc_webber Автор вопроса
Web-программист
если что, вот на js

const originalData = [[1, 2], [3, 4], [5, 6], [10, 15, 20]];
const iter = (tail) => {
if (tail.length === 1) {
return tail[0].map(i => [i]);
} else {
return tail.shift().map(item => iter([...tail]).map(t => [item, ...t])).flat();
}
};
console.log(iter(originalData));
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы