笔者在做一个小型的电商应用时,遇到了将产品属性和库存存到数据库的问题,需要组合得出多重属性的最小库存量单位(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代码运行结果: