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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-06-23 13:26:01
asal
1163 orang telah melayarinya

$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'),  ……)
Salin selepas log masuk

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


回复讨论(解决方案)

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

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

如果是这样,那么

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

两个函数的可能写法是
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;}
Salin selepas log masuk

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

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

谢谢版主,睡觉的,马上就看您写的,学习学习再学习
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan