Answer the question
In order to leave comments, you need to log in
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
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
)
)
*/
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 questionAsk a Question
731 491 924 answers to any question