Как получить ВСЕ комбинации из списка слов, используя ЛЮБОЕ количество слов

Я искал, но не могу найти ничего, что соответствует моему запросу. Я видел много решений, в которых людям нужны все комбинации чисел / слов, которые используют ВСЕ параметры, но ни одного такого ...

Вот пример:

apple pear

Это должно сгенерировать:

яблоко
груша
яблоко груша
груша яблоко

Или даже...

apple pear banana

яблоко
груша
банан
яблоко груша
яблоко банан
груша банан
...
...
банан груша яблоко

Ключевым моментом является ВСЕ возможные комбинации, в которых любое из слов используется ноль или один раз в ЛЮБОМ порядке. :)


person voteforpedro    schedule 21.09.2011    source источник
comment
Какой у вас код?   -  person jasonbar    schedule 21.09.2011
comment
возможный дубликат комбинаций, диспозиций и перестановок в PHP   -  person CanSpice    schedule 21.09.2011
comment
то, что вы хотите, статистически называется перестановкой (в отличие от комбинации и т. д.)   -  person heltonbiker    schedule 21.09.2011
comment
@ user957593 - Я обновил свой ответ рабочим кодом ^ _ ^   -  person Naftali aka Neal    schedule 21.09.2011
comment
apple apple допустимо в этом контексте?   -  person ircmaxell    schedule 21.09.2011
comment
@ircmaxell - ноль или один раз в OP ... тогда угадайте, что нет apple apple, если яблоко не будет в списке дважды   -  person Chris Baker    schedule 21.09.2011
comment
@ircmaxell так же, как если бы apple apple apple ... действителен ....   -  person Naftali aka Neal    schedule 22.09.2011


Ответы (2)


ОКОНЧАТЕЛЬНЫЙ ОТВЕТ ВНИЗ


Псевдокод (не тестировался)

$str = "apple pear banana";
$str_splode = explode(' ',$str);

echo showCombo($str_splode[0], $str_splode);

function showCombo($str, $arr){
    $ret = '';
    foreach($arr as $val){
       if($val != $str)
           $ret .= $str.showCombo($val, $arr);
    }
    return $ret;
}

Выполняемый код: http://codepad.org/IUPJbhI7

<?php

$str = "apple pear banana orange";
$str_splode = explode(' ',$str);
print_r(showCombo(array(), $str_splode));

function showCombo($str_arr, $arr){
    $ret = array();
    foreach($arr as $val){
       if(!in_array($val, $str_arr)){
           $temp = $str_arr;
           $temp[] = $val;
           print_r($temp);
           $comb = showCombo($temp, $arr);
           if(count($comb) > 0)
              $ret[] = $comb;
       }
    }
    return $ret;
}
?>

Это возвращает все возможные комбинации


Или этот выглядит лучше: http://codepad.org/KCLeRUYs

<?php

$str = "apple pear banana orange";
$str_splode = explode(' ',$str);
print_r(showCombo(array(), $str_splode));

function showCombo($str_arr, $arr){
    $ret = array();
    foreach($arr as $val){
       if(!in_array($val, $str_arr)){
           $temp = $str_arr;
           $temp[] = $val;
           $ret[$val] = $temp;
           $ret[$val][] = showCombo($temp, $arr);
       }
    }
    return $ret;
}

?>

Или, если вы хотите посмотреть на плоские клавиши: http://codepad.org/95aNQzXB


Окончательный ответ:

И здесь перечислены их все: http://codepad.org/vndOI9Yj

<?php

$str = "apple pear banana orange";
$str_splode = explode(' ',$str);
$combos = showCombo(array(), $str_splode);
foreach($combos as $key=>$array){
    echo $key.PHP_EOL;
    displayArrayByKey($key, $array);
}


function displayArrayByKey($str, $arr){
    foreach($arr as $key=>$array){
          $string = $str. " " . $key;
          echo $string . PHP_EOL; 
          if(count($array)> 0){
              displayArrayByKey($string, $array);
          }
    }
}

function showCombo($str_arr, $arr){
    $ret = array();
    foreach($arr as $val){
       if(!in_array($val, $str_arr)){
           $temp = $str_arr;
           $temp[] = $val;
           $ret[$val] = showCombo($temp, $arr);
       }
    }
    return $ret;
}

?>
person Naftali aka Neal    schedule 21.09.2011
comment
@Justin см. Обновление кода внизу ответа. - person Naftali aka Neal; 21.09.2011

Вы можете скачать этот класс: http://pear.php.net/package/Math_Combinatorics

и используйте это как:

$combinatorics = new Math_Combinatorics;

$words_arr = array(
    'one'   => 'a',
    'two'   => 'b',
    'three' => 'c',
    'four'  => 'd',
    );

for ($i=count($words_arr)-1;$i>=1;$i--) {
    echo '<br><br>' . $i . ':<br>';
    $combinations_arr = $combinatorics->combinations($words_arr, $i);
    foreach ($combinations_arr as $combinations_arr_item) {
        echo implode(', ', $combinations_arr_item) . '<br>';
    }
}
person leticia    schedule 05.05.2012