This is not a perfect solution, but anyway:
You can do this recursively:
Version 2:
function computeCombination(array $source,$picks,$startIndex=0,array $pad=array())
{
if ($picks<=0) {
return $pad;
} elseif ($picks>=count($source)-$startIndex) {
return array(array_merge($pad,array_slice($source,$startIndex)));
}
$result=array();
foreach (range($startIndex,count($source)-$picks) as $subStartIndex) {
$subPad=$pad;
$subPad[]=$source[$subStartIndex];
if (empty($pad)) {// to make the output look nice
$result=array_merge($result,computeCombination($source,$picks-1,$subStartIndex+1,$subPad));
} else {
$result=array_merge($result,array(computeCombination($source,$picks-1,$subStartIndex+1,$subPad)));
}
}
return $result;
}
print_r(computeCombination(array(1,2,3,4,5),2));
The print_r
output:
Array
(
[0] => Array
(
[0] => 1
[1] => 2
)
[1] => Array
(
[0] => 1
[1] => 3
)
[2] => Array
(
[0] => 1
[1] => 4
)
[3] => Array
(
[0] => 1
[1] => 5
)
[4] => Array
(
[0] => 2
[1] => 3
)
[5] => Array
(
[0] => 2
[1] => 4
)
[6] => Array
(
[0] => 2
[1] => 5
)
[7] => Array
(
[0] => 3
[1] => 4
)
[8] => Array
(
[0] => 3
[1] => 5
)
[9] => Array
(
[0] => 4
[1] => 5
)
)
(Old version 1)
function computeCombination(array $source,$picks,$startIndex=0,array $pad=array())
{
if ($picks<=0) {
return $pad;
} elseif ($picks>=count($source)-$startIndex) {
return array_merge($pad,array_slice($source,$startIndex));
}
$result=array();
foreach (range($startIndex,count($source)-$picks) as $subStartIndex) {
$subPad=$pad;
$subPad[]=$source[$subStartIndex];
$result=array_merge($result,array(computeCombination($source,$picks-1,$subStartIndex+1,$subPad)));
}
return $result;
}
print_r(computeCombination(array(1,2,3,4,5),2));