一个多维数组乘积的方法
之前在写淘宝相关业务的时候,看到了一段神仙代码,大概的逻辑是,如果商品有 1 个sku 属性就做一个单层循环,如果商品有 2 个sku 属性就做一个双层循环,如果商品有 3 个sku 属性就做一个双层循环。。。。 我就在想,如果要是商品的sku 属性有4、5、6(再多了也不太可能) 个,那启不是要再多写几层循环 本着,写出这样的代码就是作死的心,用在线php 运行了好多次之后,终于成功了
大概是思路是这样的,
如果我有三个数组,分别为[ 1,2 ] , ['a','b'] , ['A','B'] ----- 2 * 2 * 2 最后得出的数组应该是 8 个
第一步:算出第一个数组[ 1,2 ] 和第二个数组 ['a','b']的乘积 ----- 这一步得出一个新的数组[[1,'1'],[1,'b'],[2,'a'],[2,'b']]
第二步:用第一步得出的新数组[[1,'1'],[1,'b'],[2,'a'],[2,'b']] 与 第三个数组得出乘积 ['A','B'] 4 * 2 最后得出的数组应该是 8 个 ----- [[1,'a','A'],[1,'a','B'],[1,'b','A'],[1,'b','B'],[2,'a','A'],[2,'a','B'],[2,'b','A'],[2,'b','B']]
如果有更多的数组,则以此类推...
用这样的方法也可以有更多种结果输出,我这里因为需要用到这样的格式所以最后得出的是拼接起来的数组,这样也可以操作复杂的数据,其中有obj 也可以用。
/**
* 多个数组的乘积。
* 例:输入[ [{'a':'1','b':'2'}], [{'A':'1','B':'2'},{'C':'3','D':'4'}]]
* 输出[ [{'a':'1','b':'2'},{'A':'1','B':'2'}],[{'a':'1','b':'2'},{'C':'3','D':'4'}] ]
* @author CitrusLimonc
* @param array $arrays
* @return array
*/
function getArrByArrays($arrays){
$lastArr = array();
for ($i=0; $i < count($arrays); $i++) {
if (count($lastArr) == 0) {
$lastArr = $arrays[$i];
}
if ($i < count($arrays) - 1) {
$nextArr = $arrays[$i + 1];
} else {
break;
}
$lastArr = $this->getNextValue($lastArr,$nextArr);
}
return $lastArr;
}
function getNextValue($lastArr,$nextArr){
$newArr = array();
for($i=0; $i< count($lastArr); $i++){
for($j = 0; $j< count($nextArr); $j++){
$v1 = $lastArr[$i];
$v2 = $nextArr[$j];
if (is_array($v1)) {
$v1[] = $v2;
$value = $v1;
} else {
$value = array();
$value[] = $v1;
$value[] = $v2;
}
$newArr[] = $value;
}
}
return $newArr;
}