思路
递归出所有个数是 $gain 的集合
还需要数字个数 与 剩余可用数字个数 作比对防止重复循环
<?php
$gain = 3; // 我要从数据中取几个
$data = ['a', 'b', 'c', 'd']; //原始数据
// 删选条件不满足直接暂停
if (count($data) <= 0 OR $gain <= 0 OR $gain > count($data)){
return;
}
handle($data, $gain, []);
function handle($data, $gain, $list, $start = 1)
{
$n = count($data);
if (count($list) == $gain) {
// 满足条件取出数据
foreach ($list as $item){
$todo[] = $data[$item-1];
}
fprintf(STDOUT, implode(',', $todo) . "\n");
return;
}
// 剩余可用数字个数 $n - $i + 1
// 还需要数字个数 $gain - count($list)
// $list 记录前面取出的数据 后面再继续排序
for ($i = $start; $n - $i + 1 >= $gain - count($list); $i++) {
$list[] = $i;
handle($data, $gain, $list, $i + 1);
// 弹出在最后一个$i 继续其他的
array_pop($list);
}
}