在關聯數組中保留鍵的同時查找笛卡爾積
考慮以下關聯數組:
$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; }
此程式碼將輸出所需的笛卡爾積,同時保留原始值關聯鍵。
以上是如何在保留鍵的同時產生關聯數組的笛卡爾積?的詳細內容。更多資訊請關注PHP中文網其他相關文章!