【问题标题】:How can I list all possible combinations?如何列出所有可能的组合?
【发布时间】:2013-11-11 02:28:57
【问题描述】:
$num = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

在数组 $num 中有 10 个数字。我想用 PHP 列出所有可能的 3 位数组合。 就像:

1, 2, 3
1, 2, 4
1, 2, 5
etc

编辑:
感谢所有答案,但如果我想创建 6 个数字组合,则会出现问题。

$num_array2 = array(1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 15, 16, 18, 19, 20);

foreach($num_array2 AS $value1) {
    foreach($num_array2 AS $value2) {
        if($value2 == $value1) {
            continue;
        }
        foreach($num_array2 AS $value3) {
            if($value3 == $value1 || $value3 == $value2) {
                continue;
            }
            foreach($num_array2 AS $value4) {
                if($value4 == $value1 || $value4 == $value2 || $value4 == $value3) {
                    continue;
                }
                foreach($num_array2 AS $value5) {
                    if($value5 == $value1 || $value5 == $value2 || $value5 == $value3 || $value5 == $value4) {
                        continue;
                    }
                    foreach($num_array2 AS $value6) {
                        if($value6 == $value1 || $value6 == $value2 || $value6 == $value3 || $value6 == $value4 || $value6 == $value5) {
                            continue;
                        }
                        echo "$value1, $value2, $value3, $value4, $value5, $value6 \n<br />";
                    }
                }
            }
        }
    }
}

我无法列出

1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 7
etc.

我是不是做错了什么?

【问题讨论】:

  • 所以你会期望 10^10 (1000) 个可能的数字?
  • @Endless 实际上是10 * 8 * 9 = 720 可能的值,因为没有两个数字在一个结果中出现两次 :)
  • 猜猜我数学很差:P
  • 在这里查看解决问题的另一种方法:stackoverflow.com/questions/1256117/…
  • 实际上组合的数量,在数学意义上,所以没有列出 1,2,3 和 3,2,1,只有 10!/(3!(10-3)!) = 120.

标签: php arrays


【解决方案1】:

试试这个:

foreach($num AS $value1)
{
  foreach($num AS $value2)
  {
    if($value2 == $value1){
      continue;
    }
    foreach($num AS $value3)
    {
      if($value3 == $value1 || $value3 == $value2){
        continue;
      }
      echo "$value1, $value2, $value3<br/>";
    }
  }
}

编辑:

实际上,前面的代码列出了所有排列而不是组合。如果你想要所有组合,试试这个:

for($value1 = 1; $value1 <= 10; $value1++){
  for($value2 = $value1 + 1; $value2 <= 10; $value2++){
    for($value3 = $value2 + 1; $value3 <= 10; $value3++){
      echo "$value1, $value2, $value3<br/>";
    }
  }
}

【讨论】:

  • 为什么是条件句?
  • 否则,您将列出所有可能的排列而不是组合
  • 但是你需要条件吗?哈哈 - 很抱歉问,但我的答案缺少什么?可能错过了一些愚蠢的事情!
  • 你也可以组合一个数字被使用两次或更多,比如 1,1,1
  • 哦,当然!我在数学含义之外使用了 combination 这个词。
【解决方案2】:

有些东西...

foreach($num AS $value1)
{
  foreach($num AS $value2)
  {
    foreach($num AS $value3)
    {
      echo $value1 . ',' . $value2 . ',' . $value3 . '<br>';
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多