[英]PHP permutations using recursive function issue
我有一個數組:
$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,但我可以用簡單的力量幫助你。 下面的 Function 將生成所有組合:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.