我想在给定数组中打印子范围的所有组合。我有一些y元素的数组,我想从中打印出连续子范围的所有组合。
约束是:每个子范围应至少有2个元素,子范围中的每个元素应该是连续的。它应该共享每个元素的相同边界。
例如,我们有一个包含7个元素[11,12,13,14,11,12,13]
因此,子范围组合的总数将为[7 * (7-1) /2] = 21
所以,输出将是这样的:
11,12
12,13
13,14
14,11
11,12
12,13
11,12,13
12,13,14
13,14,11
...
11,12,13,14 and so on (total 21 combination as per above array)
我们不应该打印任何不连续的组合。例如:[11,12,14]
无效组合,因为它会跳过元素" 13"介于两者之间。
我可以使用2个元素打印组合,但是我很难打印2个以上的元素组合。
以下是我到目前为止所尝试的内容。
$data=array("11","12","13","14","11","12","13");
$totalCount=count($data);
for($i=0;$i<$totalCount;$i++){
if(($i+1) < ($totalCount)){
echo "[".$data[$i].",".$data[$i+1]."]<br>";
}
}
答案 0 :(得分:2)
你可以这样做:
$arr = [11,12,13,14,11,12,13];
function genComb($arr, $from = 1, $to = -1) {
$arraySize = count($arr);
if ($to == -1) $to = $arraySize;
$sizeLimit = $to + 1;
for ($i = $from; $i < $sizeLimit; $i++) { // size loop
$indexLimit = $arraySize - $i + 1;
for ($j = 0; $j < $indexLimit; $j++) { // position loop
yield array_slice($arr, $j, $i);
}
}
}
$count = 0;
foreach (genComb($arr, 2) as $item) {
echo implode(',', $item), PHP_EOL;
$count++;
}
echo "total: $count\n";
答案 1 :(得分:0)
Casimir et Hippolyte速度更快,但您可以通过独立处理每个连续部分来获得巨大的性能:
function getCombos(&$data) {
$combos = array();
$count = count($data);
$i = 0;
while ($i < $count) {
$start = $i++;
while ($i < $count && $data[$i - 1] + 1 == $data[$i]) // look for contiguous items
$i++;
if ($i - $start > 1) // only add if there are at least 2
addCombos($data, $start, $i, $combos); // see other answer
}
return $combos;
}