php - 如何在没有函数的情况下在php中获取数组的所有组合

标签 php for-loop combinations permutation

希望大家一切都好。 我遇到了这个问题,因为我正在寻找一种方法来获取数字数组的所有组合,但我想在没有任何函数的情况下做到这一点,我认为这是不可能的,我的所有答案已经在互联网上看到有一些功能或方法可以做到这一点。

我尝试这个,给出这个数组:

$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]));

Online Demo

关于php - 如何在没有函数的情况下在php中获取数组的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73676920/

相关文章:

php - Laravel 异步上传文件

php - 使用显示错误的不同键创建多个元字段

c++ - 如何从 vector 中删除所有项目? C++

python - 从两个坐标数组创建所有 x,y 对

matlab - matlab中矩阵的所有组合

php - Wordpress 短代码仅适用于帖子,不适用于页面。自定义主题

php - Paypal REST PHP SDK 给我一个 400 错误(laravel 库)

r - 积分函数中多个参数对应的多个数组的所有可能组合

java - 来自多个集合的组合算法

r - 将函数应用于 R 中列表元素的所有成对组合