希望大家一切都好。 我遇到了这个问题,因为我正在寻找一种方法来获取数字数组的所有组合,但我想在没有任何函数的情况下做到这一点,我认为这是不可能的,我的所有答案已经在互联网上看到有一些功能或方法可以做到这一点。
我尝试这个,给出这个数组:
$numbers=[1,2,3,4];
我构建了 4 个 for 循环来获取数组的位置,并创建一个数字,但是,假设该数组有 24 种不同的组合,通过我的 for 循环,我得到了 256 个组合
for($i = 0; $i <= 3; $i++){
for($j = 0; $j <= 3;$j++){
for($k = 0;$k <= 3;$k++){
for($l = 0; $l <= 3;$l++){
echo "$numbers[$i]$numbers[$j]$numbers[$k]$numbers[$l] <br>";
}
}
}
}
>echo "Combinations: $contador \n";
有人可以帮帮我吗? (我想获取每个值的新数组的组合,以便稍后与随机数进行比较)
最佳答案
获取所有组合的原理是下一个排列。这基本上意味着它遵循以下步骤:
输入需要按照起始组合进行排序。这简化了计算并产生统一的结果。下面的代码片段确实使用了
sort()
内置函数,但您可以推出自己的排序函数(我将其留给您作为练习)。对于下一个排列,我们需要找到 2 位数字,其中较小的数字占据较大数字的 MSB 位。
找到后,我们交换这 2 位数字并从 MSB + 1 位置反转数组。这个反向操作是为了得到下一个最小的字典组合。如果不执行,您将错过一些所需的中间组合。
当数字以非递增方式排序并产生最后可能的组合时,逻辑就会停止。
片段:
<?php
function getCombinations($numbers){
sort($numbers); // create your own custom function for sort.
$result = [ $numbers ];
do{
$x = $y = -1;
for($i = count($numbers) - 1; $i >= 0; --$i){
for($j = $i - 1; $j >= 0; --$j){
if($numbers[ $j ] < $numbers[ $i ] && ($y === -1 || $y < $j)){
$x = $i;
$y = $j;
}
}
}
if($x !== -1){
swap($numbers, $x, $y);
reverse($numbers, $y + 1, count($numbers) - 1);
$result[] = $numbers;
}
}while($x != -1);
return $result;
}
function reverse(&$numbers, $left, $right){
while($left < $right){
swap($numbers, $left++, $right--);
}
}
function swap(&$numbers, $x, $y){
$temp = $numbers[ $x ];
$numbers[ $x ] = $numbers[ $y ];
$numbers[ $y ] = $temp;
}
print_r(getCombinations([1,2,3,4]));
关于php - 如何在没有函数的情况下在php中获取数组的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73676920/