$oldArr = array(array('a','b','c','d'),array('a','b'));//組成一個新的二維數組,樣式如下$newArray = array(array('a','a'),array('a','b'),array('b','a'),array('b','b'),.......array('d','b'));//$oldArry子子項目的個數未知,就是需要組成一個新的二維數組,並去掉元素相同的數組如:array('a','a'),array('b','b');
想了一個晚上,也不知道怎麼弄,還有升級的
如果$oldArr的元素是三個的話,那麼$newarray子子項目的數量也是三個:
$oldArr = array(array('a','b','c','d'),array('a','b'),array('e','f','g'));$newArray = array(array('a','a','e'),array('a','a','f'),array('a','a','f'),array('a','b','e'),.......array('d','b','g'));//同樣要去掉元素相同的數組,只能留下三個不同的元素,如:array('a','a','e’),array('a','a','f')
回複討論(解決方案)
你的基礎演算法是求笛卡爾積
笛卡爾(Descartes)乘積又叫直積。設A、B是任意兩個集合,在集合A中任意取一個元素x,在集合B中任意取一個元素y,組成一個有序對(x,y),把這樣的有序對作為新的元素,他們的全體組成的集合稱為集合A和集合B的直積,記為A×B,即A×B={(x,y)|x∈A且y∈B}。
有關笛卡爾積的討論,在精華區收錄了不少,你可以去看看
鑒於你有對結果數組過濾的要求,所以取一種並用回呼函數實現過濾
$oldArr = array(array('a','b','c','d'),array('a','b'));//$oldArr = array(array('a','b','c','d'),array('a','b'),array('e','f','g'));print_r(Descartes($oldArr, 'foo'));function foo($a) { return count($a) == count(array_count_values($a));}function Descartes($d, $func='') { $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) { $m = array_merge(array($x), is_array($y) ? $y : array($y)); if($func && $func($m)) $t[] = $m; } } $r = $t; } return $r;}
Array( [0] => Array ( [0] => a [1] => b ) [1] => Array ( [0] => b [1] => a ) [2] => Array ( [0] => c [1] => a ) [3] => Array ( [0] => c [1] => b ) [4] => Array ( [0] => d [1] => a ) [5] => Array ( [0] => d [1] => b ))
版本牛x,對的,就是求笛卡爾積