數組合并及統計新組數的元素個數

來源:互聯網
上載者:User
$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,對的,就是求笛卡爾積

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.