我如何从 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.
我正在尝试构建一个 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.