1

配列に格納されている一部のデータの「部分的な」組み合わせ (順列ではない) の数を計算するのに少し問題があります。簡単にするために、データは次のようになります。

$test = array(
        array('1:1' => 'Option 1:1', '1:2' => 'Option 1:2', '1:3' => 'Option 1:3'),
        array('2:1' => 'Option 2:1', '2:2' => 'Option 2:2', '2:3' => 'Option 2:3'),
        array('3:1' => 'Option 3:1', '3:2' => 'Option 3:2', '3:3' => 'Option 3:3')
    );

ただし、任意の数の配列 (最大 6 つ) を持つことができ、それぞれに 2 ~ 20 のオプションを含めることができます。この形式はレガシーであり、本質的にドロップダウンを強化するために使用されるため、この形式を変更することは実際には不可能です (たとえば、配列 1 がサイズ、配列 2 が色、配列 3 が素材である衣料品店を想像してください)。

デカルト積を計算するために、単純な再帰関数 (今日はこちら) を使用しています。

$result = call_user_func_array('cartesian', $test);

function cartesian()
{
    $arrays = func_get_args();

    if(count($arrays) == 0)
    {
        return array(array());
    }

    $array      = array_shift($arrays);
    $recurse    = call_user_func_array(__FUNCTION__, $arrays);
    $return     = array();

    foreach($array as $key => $value)
    {
        foreach($recurse as $result)
        {
            $return[] = array_merge(array($key => $value), $result);
        }
    }

    return $return;
}

少量の後処理の後:

$result = neaten($result);

function neaten($array_cartesian)
{   
    $names = array();

    foreach($array_cartesian as $array)
    {
        ksort($array);
        $config_string  = array();
        $name_string    = array();

        foreach($array as $config => $name)
        {
            $config_string[]    = $config;
            $name_string[]      = $name;
        }

        $names[implode(',', $config_string)] = implode(', ', $name_string);
    }

    return $names;
}

次のようなものを生成します。

Array
(
    [1:1,2:1,3:1] => Option 1:1, Option 2:1, Option 3:1
    [1:1,2:1,3:2] => Option 1:1, Option 2:1, Option 3:2
    [1:1,2:1,3:3] => Option 1:1, Option 2:1, Option 3:3
    [1:1,2:2,3:1] => Option 1:1, Option 2:2, Option 3:1
    [1:1,2:2,3:2] => Option 1:1, Option 2:2, Option 3:2
    [1:1,2:2,3:3] => Option 1:1, Option 2:2, Option 3:3
    [1:1,2:3,3:1] => Option 1:1, Option 2:3, Option 3:1
    [1:1,2:3,3:2] => Option 1:1, Option 2:3, Option 3:2
    [1:1,2:3,3:3] => Option 1:1, Option 2:3, Option 3:3
    [1:2,2:1,3:1] => Option 1:2, Option 2:1, Option 3:1
    [1:2,2:1,3:2] => Option 1:2, Option 2:1, Option 3:2
    [1:2,2:1,3:3] => Option 1:2, Option 2:1, Option 3:3
    [1:2,2:2,3:1] => Option 1:2, Option 2:2, Option 3:1
    [1:2,2:2,3:2] => Option 1:2, Option 2:2, Option 3:2
    [1:2,2:2,3:3] => Option 1:2, Option 2:2, Option 3:3
    [1:2,2:3,3:1] => Option 1:2, Option 2:3, Option 3:1
    [1:2,2:3,3:2] => Option 1:2, Option 2:3, Option 3:2
    [1:2,2:3,3:3] => Option 1:2, Option 2:3, Option 3:3
    [1:3,2:1,3:1] => Option 1:3, Option 2:1, Option 3:1
    [1:3,2:1,3:2] => Option 1:3, Option 2:1, Option 3:2
    [1:3,2:1,3:3] => Option 1:3, Option 2:1, Option 3:3
    [1:3,2:2,3:1] => Option 1:3, Option 2:2, Option 3:1
    [1:3,2:2,3:2] => Option 1:3, Option 2:2, Option 3:2
    [1:3,2:2,3:3] => Option 1:3, Option 2:2, Option 3:3
    [1:3,2:3,3:1] => Option 1:3, Option 2:3, Option 3:1
    [1:3,2:3,3:2] => Option 1:3, Option 2:3, Option 3:2
    [1:3,2:3,3:3] => Option 1:3, Option 2:3, Option 3:3
)

27 total

これは素晴らしいことであり、まさにデカルト関数が行うべきことです。ただし、実際に必要な出力は次のようなものです。

Array
(
    [1:1]       => Option 1:1
    [1:2]       => Option 1:2
    [1:3]       => Option 1:3
    [2:1]       => Option 2:1
    [2:2]       => Option 2:2
    [2:3]       => Option 2:3
    [3:1]       => Option 3:1
    [3:2]       => Option 3:2
    [3:3]       => Option 3:3
    [1:1,2:1]   => Option 1:1, Option 2:1
    [1:1,2:2]   => Option 1:1, Option 2:2
    [1:1,2:3]   => Option 1:1, Option 2:3
    [1:2,2:1]   => Option 1:2, Option 2:1
    [1:2,2:2]   => Option 1:2, Option 2:2
    [1:2,2:3]   => Option 1:2, Option 2:3
    [1:3,2:1]   => Option 1:3, Option 2:1
    [1:3,2:2]   => Option 1:3, Option 2:2
    [1:3,2:3]   => Option 1:3, Option 2:3
    [1:1,3:1]   => Option 1:1, Option 3:1
    [1:1,3:2]   => Option 1:1, Option 3:2
    [1:1,3:3]   => Option 1:1, Option 3:3
    [1:2,3:1]   => Option 1:2, Option 3:1
    [1:2,3:2]   => Option 1:2, Option 3:2
    [1:2,3:3]   => Option 1:2, Option 3:3
    [1:3,3:1]   => Option 1:3, Option 3:1
    [1:3,3:2]   => Option 1:3, Option 3:2
    [1:3,3:3]   => Option 1:3, Option 3:3
    [2:1,3:1]   => Option 2:1, Option 3:1
    [2:1,3:2]   => Option 2:1, Option 3:2
    [2:1,3:3]   => Option 2:1, Option 3:3
    [2:2,3:1]   => Option 2:2, Option 3:1
    [2:2,3:2]   => Option 2:2, Option 3:2
    [2:2,3:3]   => Option 2:2, Option 3:3
    [2:3,3:1]   => Option 2:3, Option 3:1
    [2:3,3:2]   => Option 2:3, Option 3:2
    [2:3,3:3]   => Option 2:3, Option 3:3
    [1:1,2:1,3:1]   => Option 1:1, Option 2:1, Option 3:1
    [1:1,2:1,3:2]   => Option 1:1, Option 2:1, Option 3:2
    [1:1,2:1,3:3]   => Option 1:1, Option 2:1, Option 3:3
    [1:1,2:2,3:1]   => Option 1:1, Option 2:2, Option 3:1
    [1:1,2:2,3:2]   => Option 1:1, Option 2:2, Option 3:2
    [1:1,2:2,3:3]   => Option 1:1, Option 2:2, Option 3:3
    [1:1,2:3,3:1]   => Option 1:1, Option 2:3, Option 3:1
    [1:1,2:3,3:2]   => Option 1:1, Option 2:3, Option 3:2
    [1:1,2:3,3:3]   => Option 1:1, Option 2:3, Option 3:3
    [1:2,2:1,3:1]   => Option 1:2, Option 2:1, Option 3:1
    [1:2,2:1,3:2]   => Option 1:2, Option 2:1, Option 3:2
    [1:2,2:1,3:3]   => Option 1:2, Option 2:1, Option 3:3
    [1:2,2:2,3:1]   => Option 1:2, Option 2:2, Option 3:1
    [1:2,2:2,3:2]   => Option 1:2, Option 2:2, Option 3:2
    [1:2,2:2,3:3]   => Option 1:2, Option 2:2, Option 3:3
    [1:2,2:3,3:1]   => Option 1:2, Option 2:3, Option 3:1
    [1:2,2:3,3:2]   => Option 1:2, Option 2:3, Option 3:2
    [1:2,2:3,3:3]   => Option 1:2, Option 2:3, Option 3:3
    [1:3,2:1,3:1]   => Option 1:3, Option 2:1, Option 3:1
    [1:3,2:1,3:2]   => Option 1:3, Option 2:1, Option 3:2
    [1:3,2:1,3:3]   => Option 1:3, Option 2:1, Option 3:3
    [1:3,2:2,3:1]   => Option 1:3, Option 2:2, Option 3:1
    [1:3,2:2,3:2]   => Option 1:3, Option 2:2, Option 3:2
    [1:3,2:2,3:3]   => Option 1:3, Option 2:2, Option 3:3
    [1:3,2:3,3:1]   => Option 1:3, Option 2:3, Option 3:1
    [1:3,2:3,3:2]   => Option 1:3, Option 2:3, Option 3:2
    [1:3,2:3,3:3]   => Option 1:3, Option 2:3, Option 3:3
)

63 total

順列はなく、すべての部分的な組み合わせのみです。

私が知る限り、この特定の質問はphpでここで尋ねられていません(ただし、それを検索するために何と呼ばれているのかわかりませんが、そうであればお詫びします)。私が達成しようとしていることを理解し、リンク先のページがこの正確な問題を解決しない限り、誰もこの質問を重複として時期尚早に閉じないようにお願いします (たとえば、文字列や順列を使用したり、別の言語で解決したりするこの問題ではありません)。

コード: http://phpfiddle.org/main/code/2aw-awb

前もって感謝します!

4

1 に答える 1

2

仲間のロンドン人!これはあなたが探しているものですか?

http://phpfiddle.org/main/code/wy0-t6f

(恐ろしい構造、変数名、およびその他の欠陥を許してください...それは非常に遅いです。)

方法:元の配列からサブ配列の可能なすべての組み合わせを取得し、それぞれに対してデカルト関数とニート関数を実行します。結果の配列には、考えられるすべての順列が含まれている必要があります(ただし、ソートする必要があります)。

于 2012-11-23T00:34:20.650 に答える