假设您有一组 4 个项目,并且您想要其中 3 个项目的随机子集。您可以执行以下操作:
$myset = [ "A","B","C", "D" ];
function randomSubset($set, $size) {
$array = array_pad(array_pad([],$size,1),count($set),0); //Get an array like [ 1,1,1,0 ];
shuffle($array);
return array_intersect_key($set, array_filter($array));
}
print_r(randomSubset($myset,3));
在沙箱中查看它:http://sandbox.onlinephpfunctions.com/code/a68f3b2f1abc285424ccadbaab8a12fc4928bb8d http://sandbox.onlinephpfunctions.com/code/a68f3b2f1abc285424ccadbaab8a12fc4928bb8d
现在如果你需要all对于大小为 N 的子集,您可以执行一些递归魔术:
function allSubsets($set, $size) {
$subsets = [];
if ($size == 1) {
return array_map(function ($v) { return [$v]; },$set);
}
foreach (allSubsets($set,$size-1) as $subset) {
foreach ($set as $element) {
if (!in_array($element,$subset)) {
$newSet = array_merge($subset,[$element]);
sort($newSet);
if (!in_array($newSet,$subsets)) {
$subsets[] = array_merge($subset,[$element]);
}
}
}
}
return $subsets;
}
$myset = [ "A","B","C", "D", "E" ];
print_r(allSubsets($myset,3));
沙盒化:http://sandbox.onlinephpfunctions.com/code/01b55f0c1eb55ee82a67175d2551c164ffb2bf87 http://sandbox.onlinephpfunctions.com/code/01b55f0c1eb55ee82a67175d2551c164ffb2bf87