php二维数组算法,请教一个php中二维数组元素组合的算法

$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);

相关标签:php

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值