Heim > Backend-Entwicklung > PHP-Tutorial > 请教一个二维数组元素组合的算法

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

WBOY
Freigeben: 2016-06-23 13:26:01
Original
1105 Leute haben es durchsucht

$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'),  ……)
Nach dem Login kopieren

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


回复讨论(解决方案)

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

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

如果是这样,那么

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

两个函数的可能写法是
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;}
Nach dem Login kopieren

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

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

谢谢版主,睡觉的,马上就看您写的,学习学习再学习
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage