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