Все возможности в 2-м массиве

У меня есть этот массив:

$array = array
(
    array('1', '2', '3'),
    array('!', '@'),
    array('a', 'b', 'c', 'd'),
);

И я хочу знать всю символьную комбинацию массивов sub.. например:

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

Это работает, но я думаю, что это ужасно, и когда я добавляю больше массивов, я должен добавить больше для. Я вполне уверен существует способ сделать это рекурсивно, но я не знаю, как начать/как делать это. Немного справки могло быть хорошим!

Благодарит Вас!

5
задан Vallières 9 May 2010 в 20:57
поделиться

1 ответ

Вы можете создать рекурсивную функцию, как это:

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);
4
ответ дан 15 December 2019 в 00:53
поделиться