最近业务上遇到一个商品捆绑促销的问题,需要计算出一维数组中组合成2个有序不重复的元素组合数组。

于是总结了一下,写了一个可以通用算多一维数组中,组成有序组合数组的函数。

函数方法

/**
* 返回一维数组中,有序组合成 $count 个元素的数组
* @author Eric
* @param $arr 原数组
* @param $collect 组成新数组
* @param int $count 新数组单元素组合个数
* @return array
*/
function array_picker($arr,&$collect,$count=2) {
if (empty($arr)) {
return $collect;
}
static $temp_string;
for ($i=0; $i < count($arr); $i++) {
$temp_string[] = $arr[$i];
if(count($temp_string) < $count) {
array_picker(array_slice($arr,$i+1),$collect,$count);
}
if(count($temp_string) == $count) {
$collect[] = implode(',',$temp_string);
}
array_pop($temp_string);
}
return $collect;
}

运行结果

// 原数组
array (size=5)
0 => string 'Alpha' (length=5)
1 => string 'Beta' (length=4)
2 => string 'Gamma' (length=5)
3 => string 'Sigma' (length=5)
4 => string 'Lamda' (length=5)

// 结果数组
array (size=10)
0 => string 'Alpha,Beta,Gamma' (length=16)
1 => string 'Alpha,Beta,Sigma' (length=16)
2 => string 'Alpha,Beta,Lamda' (length=16)
3 => string 'Alpha,Gamma,Sigma' (length=17)
4 => string 'Alpha,Gamma,Lamda' (length=17)
5 => string 'Alpha,Sigma,Lamda' (length=17)
6 => string 'Beta,Gamma,Sigma' (length=16)
7 => string 'Beta,Gamma,Lamda' (length=16)
8 => string 'Beta,Sigma,Lamda' (length=16)
9 => string 'Gamma,Sigma,Lamda' (length=17)

总结

便利店销售系统中,商品捆绑优惠活动用到了商品组合的计算,也就是说存在,商品两两组合、多个商品组合的情况。

这种情况下,就可以用上述方法,获取到一堆商品里面,可以任意组合成多个有序、不重复的集合,用于捆绑活动的匹配。