7

重複の可能性:
数字または単語を取り、すべての可能な組み合わせを見つけるアルゴリズム

次のような配列がある場合:

array('a', 'b', 'c', 'd');

次のような4つの値のすべての可能な組み合わせで新しい配列を作成するにはどうすればよいですか?

aaaa, aaab, aaac, aaad ... dddb, dddc, dddd

ありがとう!

4

2 に答える 2

9

別の方法があります。

この関数はbase([配列内の要素の数])で増分します

strtr関数を使用して、文字を文字列に交換します。

function everyCombination($array) {

    $arrayCount      = count($array);
    $maxCombinations = pow($arrayCount, $arrayCount);
    $returnArray     = array();
    $conversionArray = array();

    if ($arrayCount >= 2 && $arrayCount <= 36)
    {
        foreach ($array as $key => $value) {
            $conversionArray[base_convert($key, 10, $arrayCount)] = $value;
        }

        for ($i = 0; $i < $maxCombinations; $i++) {
            $combination    = base_convert($i, 10, $arrayCount);
            $combination    = str_pad($combination, $arrayCount, "0", STR_PAD_LEFT);
            $returnArray[]  = strtr($combination, $conversionArray);
        }

        return $returnArray; 
    }

    echo 'Input array must have between 2 and 36 elements';
}

それで ...

print_r(everyCombination(array('a', 'b', 'c', 'd')));

これは、以下の再帰的な例よりも大幅に高速であるようにも見えます。

サーバーでmicrotime()を使用すると、このコードは0.072862863540649秒で実行されます

以下の再帰的な例では、0.39673089981079秒かかります。

138%高速化!

于 2012-12-24T14:03:21.987 に答える
4

再帰関数を使用する必要があります

function perm($arr, $n, $result = array())
{
    if($n <= 0) return false;
    $i = 0;

    $new_result = array();
    foreach($arr as $r) {
    if(count($result) > 0) {
        foreach($result as $res) {
                $new_element = array_merge($res, array($r));
                $new_result[] = $new_element;
            }
        } else {
            $new_result[] = array($r);
        }
    }

    if($n == 1) return $new_result;
    return perm($arr, $n - 1, $new_result);
}

$array = array('a', 'b', 'c', 'd');
$permutations = perm($array, 4);
print_r($permutations);
于 2012-12-24T13:59:39.487 に答える