-
-
Save fabiocicerchia/4556892 to your computer and use it in GitHub Desktop.
/** | |
* 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); |
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 | |
) | |
) |
I've modified function to keep your index key, example :
$options = array(
'a' => array('a1','b1'),
'b' => array('a2','b2')
);
the output will be :
Array
(
[0] => Array
(
[a] => a1
[b] => a2
)
[1] => Array
(
[a] => a1
[b] => b2
)
[2] => Array
(
[a] => b1
[b] => a2
)
[3] => Array
(
[a] => b1
[b] => b2
)
)
/**
- 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,$key = null)
{
$keys = array_keys($data);
if (isset($value) === true) {
$group[$key] = $value;
}
if ($i >= count($data)) {
array_push($all, $group);
} else {
$currentKey = $keys[$i];
$currentElement = $data[$currentKey];
if(count($data[$currentKey]) <= 0) {
generate_combinations($data, $all, $group, null, $i + 1,$currentKey);
} else {
foreach ($currentElement as $val) {
generate_combinations($data, $all, $group, $val, $i + 1,$currentKey);
}
}
}
return $all;
}
Thanks for saving life. -_-
created an account just to thank you.
you are a lifesaver!
I owe you a beer!
I have problem on processing multiple combination array.
Çok teşekkür ederim harikasın
$combos = combos($data); should be $combos = generate_combinations($data); right?