PHP使用递归函数的排列问题



我有一个数组:

$array[1] = ['a1','a2'];
$array[2] = ['b','c','d'];

我想实现以下阵列:

['a1,'b']
['a1,'c']
['a1,'d']
['a1,'b','c']
['a1,'b','d']
['a1,'c','d']
['a1,'b','c','d']
['a2,'b']
['a2,'c']
['a2,'d']
['a2,'b','c']
['a2,'b','d']
['a2,'c','d']
['a2,'b','c','d']

!!important!!$array[1]$array[2]的值可以有2个以上的项。可以有X个项目。

到目前为止,这是我的脚本:

function getAllPermutations($array, $inb = false)
{
switch (count($array)) {
case 1:
return $array[0];
break;
case 0:
echo 'Requires at least one array';
break;
}
$keys = array_keys($array);
$a = array_shift($array);
$k = array_shift($keys);
$b = getAllPermutations($array, 'recursing');
$return = [];
foreach ($a as $value) {
if($value){
foreach ($b as $value2) {
if (!is_array($value2))
$value2 = [$value2];
if((string) $inb === 'recursing') {
$return[] = array_merge([$value], (array) $value2);
}else {
$return[] = [$k => $value] + array_combine($keys, $value2);
}
}
}
}
return $return;
}

我得到这些值:

[0] => Array
(
[1] => a1
[2] => b
)
[1] => Array
(
[1] => a1
[2] => c
)
[2] => Array
(
[1] => a1
[2] => d
)
[3] => Array
(
[1] => a2
[2] => b
)
[4] => Array
(
[1] => a2
[2] => c
)
[5] => Array
(
[1] => a2
[2] => d
)

我该怎么解决这个问题有什么想法吗?谢谢

我不确定是否使用递归函数,但我可以通过简单的强制来帮助您。以下功能将生成所有组合:

function permutations(array $elements): Generator
{
$elementsCount = count($elements);
foreach ($elements as $key => $element) {
for ($offset = $key + 1; $offset < $elementsCount; $offset++) {
for ($length = 1; $length < $elementsCount - $offset + 1; $length++) {
yield array_merge(
[$element],
array_slice($elements, $offset, $length)
);
}
}
}
}
$list = ['a', 'b', 'c', 'd', 'e'];
foreach (permutations($list) as $permutation) {
echo implode(',', $permutation) . PHP_EOL;
}

结果将是:

a,b
a,b,c
a,b,c,d
a,b,c,d,e
a,c
a,c,d
a,c,d,e
a,d
a,d,e
a,e
b,c
b,c,d
b,c,d,e
b,d
b,d,e
b,e
c,d
c,d,e
c,e
d,e

但我们只需要少量修改即可满足您的任务:

<?php
function permutations(array $array): Generator
{
$elements = $array[2];
foreach ($array[1] as $node) {
$elementsCount = count($elements);
foreach ($elements as $key => $element) {
yield array_merge(
[$node],
[$element]
);
for ($offset = $key + 1; $offset < $elementsCount; $offset++) {
for ($length = 1; $length < $elementsCount - $offset + 1; $length++) {
yield array_merge(
[$node],
[$element],
array_slice($elements, $offset, $length)
);
}
}
}
}
}
$list = [
1 => ['a1', 'a2'],
2 => ['b', 'c', 'd']
];
foreach (permutations($list) as $permutation) {
echo implode(',', $permutation) . PHP_EOL;
}

结果将是:

a1,b
a1,b,c
a1,b,c,d
a1,b,d
a1,c
a1,c,d
a1,d
a2,b
a2,b,c
a2,b,c,d
a2,b,d
a2,c
a2,c,d
a2,d

这是演示

最新更新