我在寻找一种算法,将数字或单词,并找到他们的所有可能的变化一起,还让我确定有多少价值,寻找起来。

实施例可以说串或阵列是:

cat  
dog  
fish  

然后用于2的值的结果可以是:

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

SO来自该组的3项的结果是在2分相匹配的结果,点击它6个可能的变化 用3点相匹配的结果将是:

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

...或许更多的选择甚至

我发现这个例子中,这是否#2的链接,但它是在JavaScript中,我想知道如果任何人知道如何在PHP中做到这一点,也许已经有内置的东西吗?

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的字符串。数的长度是“比特”它具有例如数。数011001有(如果你有兴趣的数字25)6位。然后,如果该号码的每一位对应的条款之一,每次向上计数,如果该位是1,该术语包括在输出,而如果是0,则忽略。所以,这就是所发生的事情的基本理论。

钻研的代码

PHP没有二进制计数的方式,但你可以小数转换为二进制。所以这个功能其实在十进制计数,并将其转换为二进制。但由于位的数量是重要的,因为每个学期都需要自己的一点,你需要添加前导0,所以那是什么此位的作用:str_pad(decbin($dec), $bits, '0', STR_PAD_LEFT)

现在这个函数使用while循环,但随着次数的,它需要循环的变化取决于有多少项有,有点数学需要做的事情。如果你曾经用二进制的工作,你会知道,你可以做的最大数量为2 ^ n(其中n为比特数)。

我觉得应该已经覆盖了函数的所有混乱位,让我知道如果我错过了什么。

看看发生了什么

使用以下代码来输出所使用的逻辑,它可能使更多的感看到它这样!

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的。

您需要扩展它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top