最近业务上遇到一个商品捆绑促销的问题,需要计算出一维数组中组合成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)
|
总结
便利店销售系统中,商品捆绑优惠活动用到了商品组合的计算,也就是说存在,商品两两组合、多个商品组合的情况。
这种情况下,就可以用上述方法,获取到一堆商品里面,可以任意组合成多个有序、不重复的集合,用于捆绑活动的匹配。