M
M
Maxim Grechushnikov2020-07-21 18:08:06
PHP
Maxim Grechushnikov, 2020-07-21 18:08:06

How to collect a combination of array options?

It was a long time ago. I don't even remember what to look for.
found such options https://github.com/drupol/phpermutations
https://github.com/pear/Math_Combinatorics/blob/tr...

but it's not quite right. there is one one-dimensional array and you specify the number of options.

I have a slightly different task.

at the input any number of arrays. it is necessary to generate their combinations
for example, two arrays
[1,2],[3,4]
it should turn out
[1,3]
[1,4]
[2,3]
[2,4]

example with three arrays
[1,2] ,[3,4],[5,6]
should be
[1,3,5]
[1,3,6]
[1,4,5]
[1,4,6]
[2,3,5]
[ 2,3,6]
[2,4,5]
[2,4,6]

Answer the question

In order to leave comments, you need to log in

2 answer(s)
D
Daria Motorina, 2020-07-21
@maxyc_webber

There was a similar task, I refactored this code to fit my needs
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
        )
)
*/

M
Maxim Grechushnikov, 2020-07-21
@maxyc_webber

if anything, here on js
const originalData = ;
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));

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question