ホームページ >バックエンド開発 >PHPチュートリアル >キーを保持しながら連想配列のデカルト積を生成するにはどうすればよいですか?

キーを保持しながら連想配列のデカルト積を生成するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-25 10:39:11760ブラウズ

How to Generate the Cartesian Product of an Associative Array While Preserving Keys?

連想配列のキーを保持しながらデカルト積を求める

次のような連想配列を考えます。

$input = array(
    'arm' => array('A', 'B', 'C'),
    'gender' => array('Female', 'Male'),
    'location' => array('Vancouver', 'Calgary'),
);

目標は、元の配列を維持しながら、この配列のデカルト積を見つけることです。連想キー。望ましい出力は次のようになります。

array(
    [0] => array(
        'arm' => 'A',
        'gender' => 'Female',
        'location' => 'Vancouver'
    ),
    [1] => array(
        'arm' => 'A',
        'gender' => 'Female',
        'location' => 'Calgary'
    ),
    [2] => array(
        'arm' => 'A',
        'gender' => 'Male',
        'location' => 'Vancouver'
    ),
    ...
)

アルゴリズムの理論

入力配列には N 個のサブ配列 ($input) があり、それぞれに Cn 個の項目があると仮定します。ここで、nはそのインデックスです。 n 番目の部分配列の i 番目の項目は Vn,i と呼ばれます。

アルゴリズムは帰納法によって (バグがないと仮定して) 証明します。

  1. N = 1 の場合、デカルトproduct は単純な 1D 配列です。
  2. 結果が既に次のデカルト積を保持していると仮定します。最初の N-1 個のサブ配列は、次のように拡張できます。

    • Add KN => VN,1 を現在の結果の各項目に追加します。
    • N 番目の入力サブ配列 (2 を使用して項目のコピーを追加します。 ; VN,m.

コードの実装

function cartesian($input) {
    $result = array();

    while (list($key, $values) = each($input)) {
        if (empty($values)) {
            continue;
        }

        if (empty($result)) {
            foreach ($values as $value) {
                $result[] = array($key => $value);
            }
        } else {
            $append = array();

            foreach ($result as &$product) {
                $product[$key] = array_shift($values);
                $copy = $product;

                foreach ($values as $item) {
                    $copy[$key] = $item;
                    $append[] = $copy;
                }

                array_unshift($values, $product[$key]);
            }

            $result = array_merge($result, $append);
        }
    }

    return $result;
}

使用法

$output = cartesian($input);
print_r($output);

このコードは、目的のデカルト積を出力します。元の連想キーを保持します。

以上がキーを保持しながら連想配列のデカルト積を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。