我如何从 4 个不同的 'scenarios' 构建一个包含 PHP 中所有可能排列的数组?

How can I build an array of all possible permutations in PHP from 4 distinct 'scenarios'?

我正在尝试构建一个 php 脚本,针对给定数量的猫和项圈,构建一个包含所有可能排列的数组。

例如:

我有 4 种不同的项圈:A, B, C and D.如果我有 1 只猫,我有 4 种可能的排列 - 它们可以戴 A、B、C 或 D 项圈。

事实证明,可能的排列数是:

4n
因此,如果我有 2 只猫,我有 16 种可能的排列, 3只猫 64种排列等

所以,如果我有以下代码:

$collars = array('yellow','blue','green','pink');
$cats = array('bob','frank');
$no_cats = count($cats);

如何让它生成这些排列的数组?

Array
(
  [0] => Array
    (
      [bob] => yellow,
      [frank] => yellow
    )
  [1] => Array
   (
      [bob] => yellow,
      [frank] => blue
   )
  
 [...]
  
  [15] => Array
   (
      [bob] => pink,
      [frank] => pink
   )
 )

这是我要做的(我知道这是错误的,尤其是因为项圈环的数量被硬编码为猫的数量):

$collars = array('yellow', 'blue', 'green', 'pink');
$cats = array('bob', 'frank');
$i = 0;

foreach ($collars as $collar_a){
    foreach ($collars as $collar_b){
        foreach ($cats as $cat){
            $output[$i][$cat] = $collar_a;
            $output[$i][$cat] = $collar_b;
        }
        $i++;
    }
}

print_r($output);

这会生成:


Array
(
    [0] => Array
        (
            [bob] => yellow
            [frank] => yellow
        )

    [1] => Array
        (
            [bob] => blue
            [frank] => blue
        )

    [2] => Array
        (
            [bob] => green
            [frank] => green
        )

    [3] => Array
        (
            [bob] => pink
            [frank] => pink
        )

    [4] => Array
        (
            [bob] => yellow
            [frank] => yellow
        )

    [5] => Array
        (
            [bob] => blue
            [frank] => blue
        )

    [6] => Array
        (
            [bob] => green
            [frank] => green
        )

    [7] => Array
        (
            [bob] => pink
            [frank] => pink
        )

    [8] => Array
        (
            [bob] => yellow
            [frank] => yellow
        )

    [9] => Array
        (
            [bob] => blue
            [frank] => blue
        )

    [10] => Array
        (
            [bob] => green
            [frank] => green
        )

    [11] => Array
        (
            [bob] => pink
            [frank] => pink
        )

    [12] => Array
        (
            [bob] => yellow
            [frank] => yellow
        )

    [13] => Array
        (
            [bob] => blue
            [frank] => blue
        )

    [14] => Array
        (
            [bob] => green
            [frank] => green
        )

    [15] => Array
        (
            [bob] => pink
            [frank] => pink
        )

)

循环数正确,但排列显然不正确。我怀疑这可以通过自引用函数轻松解决,但它们超出了我的技能水平。

任何帮助都会非常感激不尽,因为我已经为此苦恼了 2 天!

为此您需要 3 个嵌套循环。

  • 第一个遍历所有猫的外循环。
  • 第二个外循环循环遍历所有以前收集的以前猫的组合结果。
  • 第三个内循环,将当前的猫和项圈组合添加到先前收集的结果中。

我认为下面的代码是可读的。

<?php

$collars = array('yellow','blue','green','pink');
$cats = array('bob','frank');

$result = [[]];
foreach($cats as $cat){
    $temp = [];
    foreach($result as $r){
        foreach($collars as $collar){
            $temp[] = array_merge($r, [ $cat => $collar]); 
        }
    }
    $result = $temp;
}


print_r($result);

可能的总组合并非总是 4n。 比如说,cats 的尺码是 m,衣领的尺码是 n。 因此,可能的总组合是 nm.