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计算数组笛卡尔乘积运行结果


7