2d dizideki tüm olasılıklar

1 Cevap php

Ben bu dizi var:

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

Ve ben, örneğin alt dizilerin .. her karakter bileşimini bilmek istiyorum:

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
...

Şu anda bu kod yaşıyorum:

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

Bu çalışır, ama çirkin olduğunu düşünüyorum, ve ben daha fazla diziler ekleme zaman, ben daha eklemek zorunda. Ben yinelemeli bunu yapmanın bir yolu vardır eminim, ama ben bunu nasıl / nasıl başlayacağınızı bilmiyorsanız. Biraz yardım güzel olabilir!

Teşekkür!

1 Cevap

Eğer böyle bir özyinelemeli işlev oluşturabilirsiniz:

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

Daha sonra:

combination($array);

Bunları yazdırmak ziyade, yeni bir dizideki tüm kombinasyonu yapmak istiyorsanız, bu nedenle gibi işlevini genişletmek:

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