一维数组 N个元素组合结果 元素之间不重复
// +--------------------------------------------
// | 一维数组 N个元素组合结果 元素之间不重复 F1+F2
// +--------------------------------------------
function permSwapArr($arr,$num=4)
{
$length = count($arr)-1;
if($num>$length) return [];
// +--------------------------------------------
// | 步骤一 4个为一组,列出所有结果
// +--------------------------------------------
$allRes = permArr($arr, 0, $length,$num);
// +--------------------------------------------
// | 步骤二 根据结果,分组
// +--------------------------------------------
$res = [];
foreach($allRes as $key=>$row) {
$rowAsort = $row;
asort($rowAsort);
$str = implode(',',$rowAsort);
$res[$str][] = $row;
}
// +--------------------------------------------
// | 步骤二 每一组随机获取一个
// +--------------------------------------------
$resArr = [];
foreach($res as $key =>$value) {
$resArr[$key] = $value[array_rand($value,1)];
}
// 得到结果随机下
shuffle($resArr);
return $resArr;
}
// F1 获取数组 N个元素组合
function permArr(&$ar, $now, $length,$num) {
$temp = array();
if($now == $length){
// 取前面4个元素
$temp[] = (array_slice($ar,0,4));
}else {
for($i=$now; $i<=$length; $i++) {
swapArr($ar[$now], $ar[$i]);
$res = permArr($ar, $now+1, $length,$num);
foreach($res as $row) {
$temp[] = $row;
}
swapArr($ar[$now], $ar[$i]);
}
}
return $temp;
}
// F2 重组数组
function swapArr(&$a, &$b) {
$c = $a;
$a = $b;
$b = $c;
}
// +--------------------------------------------
// | 入口
// +--------------------------------------------
$arr = [11,22,33,44,55,66,77,88,99];
$res = permSwapArr($arr);
echo json_encode($res);