PHP計算多維數組的笛卡爾乘積

PHP計算多維數組的笛卡爾乘積

筆者在做一個小型的電商應用時,遇到了將產品屬性和庫存存到數據庫的問題,需要組合得出多重屬性的最小庫存量單位(SKU)。把這樣的業務需求轉化成最終程序邏輯需求,就是計算多維數組的笛卡爾積。

PHP這樣的文檔網上似乎并不多,搜羅到了用PHP單個函數實現計算笛卡爾乘積的辦法。正所謂他山之石可以攻玉,在此優化整理分享出來。

/**
 * PHP計算笛卡兒積
 * @param array $input 需要計算笛卡兒積的多維數組
 * @param array $next 輔助變量用于取數據(可不填)
 * @return array
 */
function cartesian_product($input, $next = array())
{
    // 取出第一個元素
    $first = array_shift($input);
    
    // 判斷是否是第一次進行拼接
    if(count($next) == 0) {
        // 第一次拼接
        foreach($first as $ikey => $ival) {
            $result[] = $ival;
        }
    } else {
        // 之后的拼接
        foreach($next as $nkey => $nval) {
            foreach($first as $fkey => $fval) {
                // 用冒號拼接起來
                $result[] = $nval .':'. $fval;
            }
        }
    }
    
    // 遞歸進行拼接
    if(count($input) > 0) {
        $result = cartesian_product($input, $result);
    }
    
    // 返回最終的笛卡爾積
    return $result;
}


下面是一個演示例子:

// 定義多維數組
$array = array();
$array[] = array('A1','A2','A3','A4');
$array[] = array('B1','B2');
$array[] = array('C1','C2','C3');

// 計算笛卡爾積并打印出來
$sku = cartesian_product($array);
print_r($sku);

以下是PHP代碼運行結果:

PHP計算數組笛卡爾乘積運行結果


6
25选5走势图