请问如何在PHP中生成多个数组中所有项的组合

如何在PHP中生成多个数组中所有项的组合

我试图在几个数组中找到所有项目的组合。数组的数目是随机的(这可以是2,3,4,5.)。每个数组中的元素数也是随机的.

举个例子,我有三个数组:

$arrayA = array('A1','A2','A3');$arrayB = array('B1','B2','B3');$arrayC = array('C1','C2');

我想要生成一个3x3x2=18个组合的数组:

  • A1,B1,C1
  • A1,B1,C2
  • A1,B2,C1
  • A1,B2,C2
  • A1,B3,C1
  • A1,B3,C2
  • A2,B1,C1
  • A2,B1,C2.

问题是要创建一个具有可变数量的源数组的函数.


慕尼黑8549860
浏览 335回答 3
3回答

慕勒3428872

下面是递归解决方案:function combinations($arrays, $i = 0) {     if (!isset($arrays[$i])) {         return array();     }     if ($i == count($arrays) - 1) {         return $arrays[$i];     }     // get combinations from subsequent arrays     $tmp = combinations($arrays, $i + 1);     $result = array();     // concat each array from tmp with each element from $arrays[$i]     foreach ($arrays[$i] as $v) {         foreach ($tmp as $t) {             $result[] = is_array($t) ?                  array_merge(array($v), $t) :                 array($v, $t);         }     }     return $result;}print_r(     combinations(         array(             array('A1','A2','A3'),              array('B1','B2','B3'),              array('C1','C2')         )     ));

慕沐林林

这是笛卡儿的产品,我不久前也问过同样的问题..这是发布在PHP网站上的算法.function&nbsp;array_cartesian_product($arrays){ &nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;array(); &nbsp;&nbsp;&nbsp;&nbsp;$arrays&nbsp;=&nbsp;array_values($arrays); &nbsp;&nbsp;&nbsp;&nbsp;$sizeIn&nbsp;=&nbsp;sizeof($arrays); &nbsp;&nbsp;&nbsp;&nbsp;$size&nbsp;=&nbsp;$sizeIn&nbsp;>&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($arrays&nbsp;as&nbsp;$array) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$size&nbsp;=&nbsp;$size&nbsp;*&nbsp;sizeof($array); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($i&nbsp;=&nbsp;0;&nbsp;$i&nbsp;<&nbsp;$size;&nbsp;$i&nbsp;++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[$i]&nbsp;=&nbsp;array(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($j&nbsp;=&nbsp;0;&nbsp;$j&nbsp;<&nbsp;$sizeIn;&nbsp;$j&nbsp;++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_push($result[$i],&nbsp;current($arrays[$j])); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($j&nbsp;=&nbsp;($sizeIn&nbsp;-1);&nbsp;$j&nbsp;>=&nbsp;0;&nbsp;$j&nbsp;--) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(next($arrays[$j])) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif&nbsp;(isset&nbsp;($arrays[$j])) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reset($arrays[$j]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;}

慕森王

这段代码除了简单外,还可以获得多个数组的所有组合并保留键。function&nbsp;get_combinations($arrays)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;array(array()); &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($arrays&nbsp;as&nbsp;$property&nbsp;=>&nbsp;$property_values)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmp&nbsp;=&nbsp;array(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($result&nbsp;as&nbsp;$result_item)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($property_values&nbsp;as&nbsp;$property_key&nbsp;=>&nbsp;$property_value)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmp[]&nbsp;=&nbsp;$result_item&nbsp;+&nbsp;array($property_key&nbsp;=>&nbsp;$property_value); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;$tmp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;}例:Array( &nbsp;&nbsp;&nbsp;&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'1'&nbsp;=>&nbsp;'White', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'2'&nbsp;=>&nbsp;'Green', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'3'&nbsp;=>&nbsp;'Blue' &nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'4'&nbsp;=>'&nbsp;Small', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'5'&nbsp;=>&nbsp;'Big' &nbsp;&nbsp;&nbsp;&nbsp;))将返回:Array( &nbsp;&nbsp;&nbsp;&nbsp;[0]&nbsp;=>&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=>&nbsp;White &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4]&nbsp;=>&nbsp;&nbsp;Small &nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=>&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=>&nbsp;White &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[5]&nbsp;=>&nbsp;Big &nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=>&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=>&nbsp;Green &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4]&nbsp;=>&nbsp;&nbsp;Small &nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;[3]&nbsp;=>&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2]&nbsp;=>&nbsp;Green &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[5]&nbsp;=>&nbsp;Big &nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;[4]&nbsp;=>&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[3]&nbsp;=>&nbsp;Blue &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4]&nbsp;=>&nbsp;&nbsp;Small &nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;[5]&nbsp;=>&nbsp;Array &nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[3]&nbsp;=>&nbsp;Blue &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[5]&nbsp;=>&nbsp;Big &nbsp;&nbsp;&nbsp;&nbsp;))
打开App,查看更多内容
随时随地看视频慕课网APP