algorithm,将采取数字或单词,并find所有可能的组合

我正在寻找一个algorithm,将采取数字或单词,并find所有可能的变化在一起,也让我定义了多less值一起去寻找。

例子可以说,string或数组是:

cat dog fish 

那么值为2的结果可以是:

 cat dog cat fish dog cat dog fish fish cat fish dog 

因此,3个项目的结果是6个可能的变化,在2个结果匹配
与3匹配的结果是:

 cat dog fish cat fish dog dog cat fish dog fish cat fish cat dog fish dog cat 

甚至可能更多的select

我已经find了这个例子的Stackoverflow上的链接,但这是在JavaScript中,我想知道是否有人知道如何在PHP中这样做也许有东西已经build成?

http://www.merriampark.com/comb.htm (死链接)

看看http://pear.php.net/package/Math_Combinatorics

 <?php require_once 'Math/Combinatorics.php'; $words = array('cat', 'dog', 'fish'); $combinatorics = new Math_Combinatorics; foreach($combinatorics->permutations($words, 2) as $p) { echo join(' ', $p), "\n"; } 

版画

 cat dog dog cat cat fish fish cat dog fish fish dog 

如果你正在寻找这样的工作,这是我如何实现它没有使用二进制PHP库。

 function search_get_combos($query){ $list = explode(" ", $query); $bits = count($list); //bits of binary number equal to number of words in query; //Convert decimal number to binary with set number of bits, and split into array $dec = 1; $binary = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT)); while($dec < pow(2, $bits)) { //Each 'word' is linked to a bit of the binary number. //Whenever the bit is '1' its added to the current term. $curterm = ""; $i = 0; while($i < ($bits)){ if($binary[$i] == 1) { $curterm .= $list[$i]." "; } $i++; } $terms[] = $curterm; //Count up by 1 $dec++; $binary = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT)); } return $terms; } 

请注意,这将只返回唯一的组合,但可以很容易地扩展到获取每个可能的组合顺序,所以在你的例子中这个输出:

 Array ( [0] => fish [1] => dog [2] => dog fish [3] => cat [4] => cat fish [5] => cat dog [6] => cat dog fish ) 

编辑(更多说明)

基本理论

所以首先,你可能知道的二进制数是一个1和0的string。 数字的长度是它所具有的“比特”的数量,例如。 号码011001有6位(如果你感兴趣的话,号码是25)。 然后,如果数字的每一位对应于其中一个项,则每次计数时,如果该位为1,则该项包含在输出中,而如果该值为0,则忽略该项。 这就是发生什么的基本理论。

深入代码

PHP无法以二进制计数,但可以将小数转换为二进制。 所以这个函数实际上是以十进制数来计算的,并将其转换成二进制。 但是由于位数很重要,因为每一项都需要它自己的位,所以你需要加上前导0,所以这就是: str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT)

现在这个函数使用一个while循环,但是根据有多less项来循环变化需要多less次,所以需要做一些math运算。 如果你曾经使用二进制,你会知道你可以做的最大数量是2 ^ n(其中n是位数)。

我想这应该涵盖了这个function的所有混乱的部分,让我知道如果我错过了任何东西。

看看发生了什么

使用下面的代码输出所使用的逻辑,这样看来可能会更有意义!

 function search_get_combos_demo($query){ $list = explode(" ", $query); $bits = count($list); $dec = 1; while($dec < pow(2, $bits)) { $binary = str_split(str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT)); $curterm = ""; $i = 0; while($i < ($bits)){ if($binary[$i] == 1) { $curterm[] = $list[$i]." "; } $i++; } //-----DISPLAY PROCESS-----// echo "Iteration: $dec <table cellpadding=\"5\" border=\"1\"><tr>"; foreach($binary as $b){ echo "<td>$b</td>"; } echo "</tr><tr>"; foreach($list as $l){ echo "<td>$l</td>"; } echo "</tr></table>Output: "; foreach($curterm as $c){ echo $c." "; } echo "<br><br>"; //-----END DISPLAY PROCESS-----// $terms[] = $curterm; $dec++; } return $terms; } 

你可以试试这个开源的代码。 它实现了迭代器。 点击

可用PHP,Java。

你需要扩展它。