Rumah >pembangunan bahagian belakang >tutorial php >请教一个二维数组元素组合的算法

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

WBOY
WBOYasal
2016-06-23 13:26:011109semak imbas

$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;}

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

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

谢谢版主,睡觉的,马上就看您写的,学习学习再学习
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn