Home >Backend Development >PHP Tutorial >请教一个二维数组元素组合的算法

请教一个二维数组元素组合的算法

WBOY
WBOYOriginal
2016-06-23 13:26:011102browse

$arr = array(    array('a','b','c'),    array('c','f'),    array('g','z'),    array('x','y'));//$arr子集元素长度可能会多一些//将$arr的子集元素与$arr其他子集元素两两组合或者三三四四组合//子集array('a','b','c')中的元素不需要组合//两两组合$newarr = array(  array('a','c'),  array('a','f'),  array('b','c'),  array('b','f'),  array('c','c'),  array('c','f'),  ……)//三三组合$newarr = array(  array('a','c','g'),  array('a','f','g'),  array('b','c','g'),  array('b','f','g'),  array('c','c','g'),  array('c','f','g'),  ……)//四四组合$newarr = array(  array('a','c','g','x'),  array('a','f','g','x'),  array('b','c','g','x'),  array('b','f','g','x'),  array('c','c','g','x'),  array('c','f','g','x'),  ……)

用一个函数可以实现吗?
//$arr:原始数组,$cNum:组合长度function getCombination($arr,$cNum){  ……}


回复讨论(解决方案)

你把一个 Combination(n 取 m 的组合)和一个 Descartes(笛卡尔积)函数揉和在一起就可以了
其实并不需要只写成一个函数,写成一个反而失去了普遍性

我一开始也是想到,先取符合长度的数组,再求笛卡尔积
先用递归,再求积,最后合并数组?

如果是这样,那么

function getCombination($arr, $cNum) {   $res = array();   foreach( Combination($arr, $cNum) as $item) {      $res = array_merge($res, Descartes($item));   }   return $res;}
就可以了

两个函数的可能写法是
function Combination( $arr, $num=0) {	$arr = array_values($arr);	$len = count($arr);	if($num <= 0 || $num > $len) $num = $len;	$res = array();	for($i=1,$n=pow(2, $len); $i<$n; ++$i) {		$tmp = str_pad(base_convert($i, 10, 2), $len, '0', STR_PAD_LEFT);		$t = array();		for($j=0; $j<$len; ++$j) {			if($tmp{$j} == '1') {				$t[] = $arr[$j];			}		}		if(count($t) == $num) $res[] = $t;	}	return $res;}function Descartes($d) {	$r = array_pop($d);	while($d) {		$t = array();		$s = array_pop($d);		if(! is_array($s)) $s = array($s);		foreach($s as $x) {			foreach($r as $y) $t[] = array_merge(array($x), is_array($y) ? $y : array($y));		}		$r = $t;	}	return $r;}

常用的算法都应写成函数,形成代码库。在需要时调用,不必每次都写

常用的算法都应写成函数,形成代码库。在需要时调用,不必每次都写

谢谢版主,睡觉的,马上就看您写的,学习学习再学习
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn