ホームページ > バックエンド開発 > PHPチュートリアル > PHP で複数の配列からすべての組み合わせを再帰的に生成するにはどうすればよいですか?

PHP で複数の配列からすべての組み合わせを再帰的に生成するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-14 02:09:10
オリジナル
789 人が閲覧しました

How to Generate All Combinations from Multiple Arrays in PHP Recursively?

PHP で複数の配列から組み合わせを生成する

はじめに

すべての組み合わせを生成するタスク複数の配列からの項目の欠落は、組み合わせ最適化の問題でよく発生します。この記事では、可変数のソース配列を処理できる関数の必要性に対処する再帰的ソリューションを紹介します。

問題ステートメント

異なる数のソース配列が複数あるとします。要素を使用して、項目のすべての組み合わせを検索します。組み合わせの数は、各配列内の要素の数の積と等しくなります。たとえば、次の配列があるとします:

$arrayA = array('A1','A2','A3');
$arrayB = array('B1','B2','B3');
$arrayC = array('C1','C2');
ログイン後にコピー

18 個の組み合わせの配列を生成することを目的としています:

[
    ['A1', 'B1', 'C1'],
    ['A1', 'B1', 'C2'],
    ['A1', 'B2', 'C1'],
    ...
]
ログイン後にコピー

再帰的解決策

次の再帰関数は、可能なすべての組み合わせを生成します。 items:

function combinations($arrays, $i = 0) {
    // If reaching the last array, return the array itself
    if (!isset($arrays[$i])) {
        return array();
    }
    
    // If at the parent array, return the recursive call to the following array
    if ($i == count($arrays) - 1) {
        return $arrays[$i];
    }
    
    // Get combinations from subsequent arrays
    $tmp = combinations($arrays, $i + 1);

    $result = array();

    // Concatenate each array from tmp with each element from $arrays[$i]
    foreach ($arrays[$i] as $v) {
        foreach ($tmp as $t) {
            $result[] = is_array($t) ? 
                array_merge(array($v), $t) :
                array($v, $t);
        }
    }
    
    return $result;
}
ログイン後にコピー

デモ

次のコードは、組み合わせ関数の使用法を示しています。

print_r(
    combinations(
        array(
            array('A1','A2','A3'), 
            array('B1','B2','B3'), 
            array('C1','C2')
        )
    )
);
ログイン後にコピー

これは、期待される配列を出力します。 18 通りの組み合わせ。

以上がPHP で複数の配列からすべての組み合わせを再帰的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート