2017-03-23 11 views
1

指定された配列内のすべてのサブ範囲の組み合わせを印刷したいとします。私はそれから、私は連続したサブ範囲のすべての組み合わせを印刷したい要素のy個の配列を持っています。指定された配列内のサブ範囲のすべての組み合わせを出力します。

制約条件:各サブ範囲には少なくとも2つの要素があり、サブ範囲内の各要素は連続している必要があります。それは各要素の同じ境界を共有する必要があります。

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) 

たとえば、私たちは、7つの要素[11,12,13,14,11,12,13]

の配列を持っているので、サブ範囲の組み合わせの総数は[7 * (7-1) /2] = 21

ので、出力は次のようなものになりますでしょう

連続していない組み合わせは印刷しないでください。例:[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

可能な重複:どのように1D配列のすべての可能な組み合わせを取得しますか?](@stackoverflow.com/questions/10834393/php-how-to-get-all-possible-combinations-of-1d-array) –

+0

@LucasMendesその複製ではありませんテ。私はその組み合わせが連続したものにしたい。上の例のように[11,12,14]は連続していないので有効な組み合わせではなく、その間に要素 "13"をスキップします。各組み合わせの要素は同じ境界を共有する必要があります。 –

+1

@ViditMody、あなたの例では、すべての組み合わせを印刷しています。正しいサンプル出力を含めるには、質問を編集する必要があります。 – GentlemanMax

答えて

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"; 
+0

ありがとう@Casimir。魅力のように働いた。 :) –

0

Casimir et Hippolyteは速かったが、あなたは、それぞれ独立に連続したセクションを処理することによって、巨大なパフォーマンスを得ることができます:[PHPの

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; 
} 
+0

ありがとう@マラカ。 addCombos()関数を呼び出しています。しかし、その関数はどこに定義されていますか?また、あなたのコメントは、他の答えを参照してください。どの答えを教えてもらえますか?ありがとう –

関連する問題