Как получить ВСЕ комбинации из списка слов, используя ЛЮБОЕ количество слов - PullRequest
1 голос
/ 21 сентября 2011

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

Вот пример:

apple pear

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

яблоко
груша
яблочная груша
грушевое яблоко

или даже ...

apple pear banana

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

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

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

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


Псевдокод (не проверен)

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

?>
1 голос
/ 06 мая 2012

Вы можете скачать этот класс: 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>';
    }
}
...