如何使用任意数量的单词获得单词列表的所有组合


How to get ALL combinations of a list of words using ANY number of words

我已经搜索了,但我找不到任何匹配我的查询。我见过很多解决方案,人们想要使用所有选项的数字/单词的所有组合,但没有一个像这样…

下面是一个例子:

apple pear

这应该生成:


苹果梨
苹果梨
梨苹果

甚至…

apple pear banana

苹果梨
香蕉
苹果梨
苹果香蕉
梨香蕉


…香蕉梨苹果

关键是,所有可能的组合,以任何顺序使用任何单词中的0或1次。:)

最终答案在底部


伪代码(未测试)

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

您可以下载这个类: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>';
    }
}