php数组排列组合(递归形式),可用于服装等商品规格的排列组合
php数组排列组合(递归形式),可用于服装等商品规格的排列组合
一,排列组合返回数组
/* * 二维数组的递归排列组合 * 格式: $spce_arr = [[...],[...],[...],...] * 样例: $spec = [ ['x','xl','xxl'], ['红色','黑色','灰色','紫色'], ['男款','女款'], ]; */ function specArrCombination($arr,$i=0,$tmp=[]){ $g_a = []; if(count($arr)-1<=$i){ $ar = []; foreach($arr[$i] as $key=>$val){ $tmp_sukarr=[]; if($i==0){ $tmp_sukarr[] = $val; $ar[] = $tmp_sukarr; }else{ $tmp_sukarr=$tmp; $tmp_sukarr[] = $val; $ar[] = $tmp_sukarr; } } return $ar; }else{ foreach($arr[$i] as $key=>$val){ $tmp_sukarr=[]; if(count($tmp)<=0){ $tmp_sukarr[] = $val; }else{ $tmp_sukarr=$tmp; $tmp_sukarr[] = $val; } $tmpNode = $tmp_sukarr; $g_a = array_merge($g_a,specArrCombination($arr,$i+1,$tmpNode)); } } return $g_a; }
例子:
$spec = [ ['x','xl','xxl'], ['红色','黑色','灰色','紫色'], ['男款','女款'], ]; $res1 = specArrCombination($spec);//测试一下排列组合 var_dump($res1);
结果是数组形式(要其他格式如字符串需要自行修改方法或看下面)
=======================================
二,排列组合返回字符串
/* * 二维数组的递归排列组合 * 格式: $spce_arr = [[...],[...],[...],...] * 样例: $spec = [ ['x','xl','xxl'], ['红色','黑色','灰色','紫色'], ['男款','女款'], ]; */ function specArrCombination($arr,$i=0,$tmp=''){//$tmp=[] $g_a = []; if(count($arr)-1<=$i){ $ar = []; foreach($arr[$i] as $key=>$val){ $tmp_sukarr = '';//$tmp_sukarr=[]; if($i==0){ $tmp_sukarr .= $val;//$tmp_sukarr[] = $val; $ar[] = $tmp_sukarr; }else{ $tmp_sukarr=$tmp; $tmp_sukarr .= ','.$val;//$tmp_sukarr[] = $val; $ar[] = $tmp_sukarr; } } return $ar; }else{ foreach($arr[$i] as $key=>$val){ $tmp_sukarr = '';//$tmp_sukarr=[]; if($tmp==''){//count($tmp)<=0 $tmp_sukarr .= $val;//$tmp_sukarr[] = $val; }else{ $tmp_sukarr=$tmp; $tmp_sukarr .= ','.$val;//$tmp_sukarr[] = $val; } $tmpNode = $tmp_sukarr; $g_a = array_merge($g_a,specArrCombination($arr,$i+1,$tmpNode)); } } return $g_a; }
例子:
$spec = [ ['x','xl','xxl'], ['红色','黑色','灰色','紫色'], ['男款','女款'], ]; $res1 = specArrCombination($spec);//测试一下排列组合 var_dump($res1);
结果是字符串形式: