簡體   English   中英

PHP 排列使用遞歸 function 問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM