ホームページ >バックエンド開発 >PHPチュートリアル >キーを保持しながら連想配列のデカルト積を生成するにはどうすればよいですか?
連想配列のキーを保持しながらデカルト積を求める
次のような連想配列を考えます。
$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 と呼ばれます。
アルゴリズムは帰納法によって (バグがないと仮定して) 証明します。
結果が既に次のデカルト積を保持していると仮定します。最初の N-1 個のサブ配列は、次のように拡張できます。
コードの実装
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 サイトの他の関連記事を参照してください。