java二维数组全排列_PHP二维数组排列组合

最近遇到一个有关排列组合的计算问题:将多个用户属性(性别、地区、级别等)进行排列组合,并筛选出符合条件的用户群体。除了作为筛选功能外,电商的SKU也可以利用这个算法求出所有的组合情况。

思路

排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。——百度百科

以上是百度百科关于排列组合的描述,在这个场景中,其实就是把多个属性的多个元素进行不重复的组合。如:

性别:男、女

级别:1级、2级、3级

地区:广东、北京

组合出来有12种情况,即各属性元素个数的乘积:

男、1级、广东

女、1级、广东

男、2级、广东

女、2级、广东

男、3级、广东

女、3级、广东

男、1级、北京

女、1级、北京

男、2级、北京

女、2级、北京

男、3级、北京

女、3级、北京

使用计算机的解题的思路是:遍历所有属性,每次将一个属性的所有元素放入最终结果集中,并将结果集作为模板,代入下一个属性计算中。

编码

function combination(array $options)

{

$rows = [];

foreach ($options as $option => $items) {

if (count($rows) > 0) {

// 2、将第一列作为模板

$clone = $rows;

// 3、置空当前列表,因为只有第一列的数据,组合是不完整的

$rows = [];

// 4、遍历当前列,追加到模板中,使模板中的组合变得完整

foreach ($items as $item) {

$tmp = $clone;

foreach ($tmp as $index => $value) {

$value[$option] = $item;

$tmp[$index] = $value;

}

// 5、将完整的组合拼回原列表中

$rows = array_merge($rows, $tmp);

}

} else {

// 1、先计算出第一列

foreach ($items as $item) {

$rows[][$option] = $item;

}

}

}

return $rows;

}

$options = array(

'sex' => [1, 2],

'area' => [1, 2, 3, 4, 5, 6, 7, 8, 9],

'level' => [1, 2, 3, 4],

);

$rows = combination($options);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值