二维阵列中的所有可能性

时间:2010-05-09 20:57:07

标签: php algorithm arrays

我有这个数组:

$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/>';
        }
    }
}

它有效,但我觉得它很难看,当我添加更多数组时,我必须添加更多数组。我很确定有一种方法可以递归地执行此操作,但我不知道如何启动/如何执行此操作。一点点帮助可能会很好!

谢谢!

1 个答案:

答案 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);