以体彩11选5为例,共计11个数字,实现11个数字任3的全排列/全组合。
定义数组$res = array('01','02','03','04','05','06','07','08','09','10','11')。
一、全排列
1、基本思路
向3个位置里面顺序插入元素,去除重复一次、二次的组合,得到最后排列结果。
2、实现代码
$a1 = $a2 = $a3 = array();
$zh1 = $zh2 = $zh3 = array();
for($i=0;$i<11;$i++)
{
$a1 = array(strval($res[$i]));
array_push($zh1, $a1);//每循环一次,压入一个组合
for($j=0;$j<11;$j++)
{
$a2 = empty($a2)?array_pop($zh1):$a2;
$tmp2 = $a2;
array_push($a2, strval($res[$j]));
array_push($zh2, $a2);
$a2 = $tmp2;
unset($tmp2);
for($k=0;$k<11;$k++)
{
$a3 = empty($a3)?array_pop($zh2):$a3;
$tmp3 = $a3;
array_push($a3, strval($res[$k]));
array_push($zh3, $a3);
$a3 = $tmp3;
unset($tmp3);
}
$a3 = array();//清空a3值,进入下一次组合循环
}
$a2 = array();//清空a2值,进入下一次组合循环
}
至此$zh3中储存了所有排列的情况,包括重复一次、二次元素的组合,下一步是清除组合中重复的排列。
$zh = $zh3;
foreach ($zh as $key => $value) {
$value = array_unique($value);
if(count($value)!=3)
{
unset($zh[$key]);
}else
{
sort($value);
$zh[$key] = $value;
}
}
$zh = array_values($zh);
至此,$zh中存储的是11选5所有3位数值的全排列情况。
二、全组合
1、基本思路
全组合是在全排列的基础上去除重复的数组值。
2、实现代码
对全排列中的值去重复,去除二维数组中重复值,基本思路是将二维数组转换为字符串,存为一维数组,去重,再转换为二维数组。
$temp = array();
foreach ($zh as $key => $value) {
$v = implode(',', $value);
$temp[] = $v;
}
$temp = array_unique($temp);
foreach ($temp as $ks => $vs) {
$tmp = explode(',', $vs);
foreach ($tmp as $kks => $vvs) {
$tmp[$kks] = $vvs;
}
$temp[$ks] = $tmp;
}
$zh = $temp;
unset($temp);
$zh = array_values($zh);
$keys = array();
foreach ($zh as $key => $value) {
$keys[] = implode('', $value);
}
$zh = array_combine($keys, $zh);