請教一個php中二維數組元素組合的演算法

來源:互聯網
上載者:User
$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'),  ……)

用一個函數可以實現嗎?

//$arr:原始數組,$cNum:組合長度function getCombination($arr,$cNum){  ……}

回複內容:

$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'),  ……)

用一個函數可以實現嗎?

//$arr:原始數組,$cNum:組合長度function getCombination($arr,$cNum){  ……}

遞迴?

$arr = array(    array('a', 'b', 'c'),    array('c', 'f'),    array('g', 'z'),    array('x', 'y'));//$arr:原始數組,$cNum:組合長度function getCombination($arr, $cNum) {    if ($cNum === 0) {        return return array(            array('a'),            array('b'),            array('c'),        );    } else {        $tmpArr2 = $arr;        $resultArr = array();        array_pop($tmpArr2);        $lastNewArr = getCombination($tmpArr2, $cNum - 1);        for ($i = 0; $i < count($lastNewArr); $i++) {            for ($j = 0; $j < count($arr[$cNum]); $j++) {                $tmpArr = $lastNewArr[$i];                $tmpArr[] = $arr[$cNum][$j];                $resultArr[] = $tmpArr;            }        }        return $resultArr;    }}print_r(getCombination($arr, count($arr) - 1));

呃……我目前的想法是先取符合組合長度規定的數組,再求笛卡爾積,最後合并成新數組……
三個函數完成。

題主的問題應該是 PHP計算二維數組笛卡爾積 吧?如果是的話,請看以下代碼:

class Descartes{    public $sourceArray;    public $resultArray;    public function __construct($array, $result)    {        $this->sourceArray = $array;        $this->resultArray = $result;    }    public function calcDescartes($arrIndex, $arrResult)    {        if ($arrIndex >= count($this->sourceArray)) {            array_push($this->resultArray, $arrResult);            return ;        }        $currentArray = $this->sourceArray[$arrIndex];        $currentArrayCount = count($currentArray);        $arrResultCount = count($arrResult);        for ($i = 0; $i < $currentArrayCount; ++$i) {            $currentArraySlice = array_slice($arrResult, 0, $arrResultCount);            array_push($currentArraySlice, $currentArray[$i]);            $this->calcDescartes($arrIndex + 1, $currentArraySlice);        }    }}$example = [    ['a', 'b', 'c'],    ['c', 'f'],    ['g', 'z'],    ['x', 'y']];$result = [];$descartes = new Descartes($example, $result);$descartes->calcDescartes(0, $result);var_dump($descartes->resultArray);
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.