PHP对于若干数字全排列/全组合的实现一例

以体彩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);



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值