我有这个数组:
$array = array
(
array('1', '2', '3'),
array('!', '@'),
array('a', 'b', 'c', 'd'),
);
我想知道子数组的所有字符组合..例如:
1!a
1!b
1!c
1!d
1@a
1@b
1@c
1@d
2!a
2!b
2!c
2!d
2@a
2@b
...
目前我有这个代码:
for($i = 0; $i < count($array[0]); $i++)
{
for($j = 0; $j < count($array[1]); $j++)
{
for($k = 0; $k < count($array[2]); $k++)
{
echo $array[0][$i].$array[1][$j].$array[2][$k].'<br/>';
}
}
}
它有效,但我觉得它很难看,当我添加更多数组时,我必须添加更多数组。我很确定有一种方法可以递归地执行此操作,但我不知道如何启动/如何执行此操作。一点点帮助可能会很好!
谢谢!
答案 0 :(得分:4)
您可以创建这样的递归函数:
function combination($array, $str = '') {
$current = array_shift($array);
if(count($array) > 0) {
foreach($current as $element) {
combination($array, $str.$element);
}
}
else{
foreach($current as $element) {
echo $str.$element . PHP_EOL;
}
}
}
然后:
combination($array);
如果您希望将所有组合放在一个新数组中,而不是打印它们,请像这样扩展函数:
function combination($array, array &$results, $str = '') {
$current = array_shift($array);
if(count($array) > 0) {
foreach($current as $element) {
combination($array, $results, $str.$element);
}
}
else{
foreach($current as $element) {
$results[] = $str.$element;
}
}
}
$results = array();
combination($array, $results);