如果你正在寻找这样的东西是如何工作的,这就是我在没有使用二进制的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的字符串。数字的长度是它具有的“位”数,例如。该数字有6位(如果您感兴趣,请为数字25)。然后,如果数字的每个位对应于其中一个项,则每次向上计数时,如果该位为1,则该项包含在输出中,而如果它是0,则忽略它。这就是正在发生的事情的基本理论。011001
深入研究代码
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;
}