Heim  >  Artikel  >  Backend-Entwicklung  >  PHP丢框,即:多个数组任意排列组合为一个大数组,同时必须包含所有原数组

PHP丢框,即:多个数组任意排列组合为一个大数组,同时必须包含所有原数组

WBOY
WBOYOriginal
2016-06-23 14:01:59799Durchsuche

php 数组 任意 排列 组合

和部门同时讨论了一上午了,没有讨论出结果来,基本需求如下:
假设:
$a = array('a');
$b = array('b');
$c = array('c');
$d = array('d');

通过一个函数获取以下结果:
array(
  a+b+c+d,
  ab+c+d,
  ac+b+d,
  ad+b+c,
  bc+ad,
  bc+a+d,
  bd+ac,
  bd+a+c
  cd+ab,
  cd+a+b,
  abc+a,
  acd+b,
  abd+c,
  bcd+a,
  ...
)

即获取所有数组的组合方式,任意组合数组排序不一定按照顺序,但是要求组合必须出现全部元素。
有高人给个好的算法或者思路么?

回复讨论(解决方案)

用现成的函数实现,未作优化

$a = array('a', 'b', 'c', 'd');$res = array();foreach(arrangement($a) as $v) {  $res = array_merge($res, foo(explode(' ', trim($v))));}print_r($res);//排列 arrangementfunction arrangement($arr = array(), $res = '') {  if(! is_array($arr) ) $arr = str_split($arr);  if(empty($arr)) $array[] = $res;  else foreach($arr AS $k => $v) {    unset($arr[$k]);    foreach( Arrangement($arr, $res . " $v") AS $t) $array[] = $t;    $arr[$k]    = $v;  }  return  $array;}function foo($ar) {  $res = array();  if(count($ar) > 2) {    $t = array_shift($ar);    foreach(foo($ar) as $v) {      $res[] = "$t$v";       $res[] = "$t+$v";    }  }else {    $res[] = "$ar[0]$ar[1]";     $res[] = "$ar[0]+$ar[1]";  }  return $res;}
Array(    [0] => abcd    [1] => a+bcd    [2] => ab+cd    [3] => a+b+cd    [4] => abc+d    [5] => a+bc+d    [6] => ab+c+d    [7] => a+b+c+d    [8] => abdc    [9] => a+bdc    [10] => ab+dc    [11] => a+b+dc    [12] => abd+c    [13] => a+bd+c    [14] => ab+d+c    [15] => a+b+d+c    [16] => acdb    [17] => a+cdb    [18] => ac+db    [19] => a+c+db    [20] => acd+b    [21] => a+cd+b    [22] => ac+d+b    [23] => a+c+d+b    [24] => acbd    [25] => a+cbd    [26] => ac+bd    [27] => a+c+bd    [28] => acb+d    [29] => a+cb+d    [30] => ac+b+d    [31] => a+c+b+d    [32] => adbc    [33] => a+dbc    [34] => ad+bc    [35] => a+d+bc    [36] => adb+c    [37] => a+db+c    [38] => ad+b+c    [39] => a+d+b+c    [40] => adcb    [41] => a+dcb    [42] => ad+cb    [43] => a+d+cb    [44] => adc+b    [45] => a+dc+b    [46] => ad+c+b    [47] => a+d+c+b    [48] => bcda    [49] => b+cda    [50] => bc+da    [51] => b+c+da    [52] => bcd+a    [53] => b+cd+a    [54] => bc+d+a    [55] => b+c+d+a    [56] => bcad    [57] => b+cad    [58] => bc+ad    [59] => b+c+ad    [60] => bca+d    [61] => b+ca+d    [62] => bc+a+d    [63] => b+c+a+d    [64] => bdac    [65] => b+dac    [66] => bd+ac    [67] => b+d+ac    [68] => bda+c    [69] => b+da+c    [70] => bd+a+c    [71] => b+d+a+c    [72] => bdca    [73] => b+dca    [74] => bd+ca    [75] => b+d+ca    [76] => bdc+a    [77] => b+dc+a    [78] => bd+c+a    [79] => b+d+c+a    [80] => bacd    [81] => b+acd    [82] => ba+cd    [83] => b+a+cd    [84] => bac+d    [85] => b+ac+d    [86] => ba+c+d    [87] => b+a+c+d    [88] => badc    [89] => b+adc    [90] => ba+dc    [91] => b+a+dc    [92] => bad+c    [93] => b+ad+c    [94] => ba+d+c    [95] => b+a+d+c    [96] => cdab    [97] => c+dab    [98] => cd+ab    [99] => c+d+ab    [100] => cda+b    [101] => c+da+b    [102] => cd+a+b    [103] => c+d+a+b    [104] => cdba    [105] => c+dba    [106] => cd+ba    [107] => c+d+ba    [108] => cdb+a    [109] => c+db+a    [110] => cd+b+a    [111] => c+d+b+a    [112] => cabd    [113] => c+abd    [114] => ca+bd    [115] => c+a+bd    [116] => cab+d    [117] => c+ab+d    [118] => ca+b+d    [119] => c+a+b+d    [120] => cadb    [121] => c+adb    [122] => ca+db    [123] => c+a+db    [124] => cad+b    [125] => c+ad+b    [126] => ca+d+b    [127] => c+a+d+b    [128] => cbda    [129] => c+bda    [130] => cb+da    [131] => c+b+da    [132] => cbd+a    [133] => c+bd+a    [134] => cb+d+a    [135] => c+b+d+a    [136] => cbad    [137] => c+bad    [138] => cb+ad    [139] => c+b+ad    [140] => cba+d    [141] => c+ba+d    [142] => cb+a+d    [143] => c+b+a+d    [144] => dabc    [145] => d+abc    [146] => da+bc    [147] => d+a+bc    [148] => dab+c    [149] => d+ab+c    [150] => da+b+c    [151] => d+a+b+c    [152] => dacb    [153] => d+acb    [154] => da+cb    [155] => d+a+cb    [156] => dac+b    [157] => d+ac+b    [158] => da+c+b    [159] => d+a+c+b    [160] => dbca    [161] => d+bca    [162] => db+ca    [163] => d+b+ca    [164] => dbc+a    [165] => d+bc+a    [166] => db+c+a    [167] => d+b+c+a    [168] => dbac    [169] => d+bac    [170] => db+ac    [171] => d+b+ac    [172] => dba+c    [173] => d+ba+c    [174] => db+a+c    [175] => d+b+a+c    [176] => dcab    [177] => d+cab    [178] => dc+ab    [179] => d+c+ab    [180] => dca+b    [181] => d+ca+b    [182] => dc+a+b    [183] => d+c+a+b    [184] => dcba    [185] => d+cba    [186] => dc+ba    [187] => d+c+ba    [188] => dcb+a    [189] => d+cb+a    [190] => dc+b+a    [191] => d+c+b+a)

多谢版主,函数我有话下,去重就OK啦。
去重后再次贴出,多谢先,稍后确认。

有重复的吗?显然没有
print_r(array_unique($res));

print_r($res);
的结果一样!

var_dump(count($res) == count(array_unique($res)));
bool(true)

抱歉版主,我没有解释清楚,A+B+C+D 和 B+A+C+D, D+C+A+B等算一种。

Stellungnahme:
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
Vorheriger Artikel:HTTP 错误 403.14Nächster Artikel:php 如何去除回车换行符