PHP 開発において、配列は最も重要なデータ構造の 1 つです。その中でも、配列の連続番号を見つけることは非常に一般的な要件です。この記事では、これを行うさまざまな方法について説明します。
ループ トラバーサル メソッドは、配列内の連続した番号を見つけるための一般的な方法です。基本的な考え方は、配列の最初の要素が開始点であると仮定し、この開始点から要素を逆方向にたどり、次の要素と現在の要素の差が 1 であるかどうかを毎回計算することです。 「はい」の場合、配列内に連続した番号があることを意味します。そうでない場合は、開始点をリセットしてトラバースを続けます。
サンプル コードは次のとおりです。
function findConsecutiveNumbers($arr){ $res = []; $n = count($arr); for($i=0;$i<$n;$i++){ $j=$i+1; $tmp=[]; $tmp[] = $arr[$i]; while($j<$n && $arr[$j]-$arr[$j-1]==1){ $tmp[] = $arr[$j]; $j++; } if(count($tmp)>1){ $res[] = $tmp; } } return $res; } $arr = [1, 2, 3, 5, 6, 7, 9]; $res = findConsecutiveNumbers($arr); print_r($res); //输出[[1,2,3],[5,6,7]]
ソート メソッドは、配列内の連続した数値を取得するためのもう 1 つの一般的な方法です。基本的な考え方は、まず元の配列を並べ替え、次に配列要素を順番に走査し、各要素と前の要素の差が 1 であるかどうかを計算します。 「はい」の場合、配列内に連続した番号があることを意味します。そうでない場合は、開始点をリセットしてトラバースを続けます。
サンプルコードは以下のとおりです。
function findConsecutiveNumbers($arr){ sort($arr); $res = []; $n = count($arr); $tmp = []; for($i=0;$i<$n;$i++){ if(!$i || $arr[$i]-$arr[$i-1]==1){ $tmp[] = $arr[$i]; }else{ if(count($tmp)>1){ $res[] = $tmp; } $tmp = [$arr[$i]]; } } if(count($tmp)>1){ $res[] = $tmp; } return $res; } $arr = [1, 2, 3, 5, 6, 7, 9]; $res = findConsecutiveNumbers($arr); print_r($res); //输出[[1,2,3],[5,6,7]]
再帰的メソッドも配列の連続番号を取得するメソッドです。各要素を再帰的に走査し、各要素と前の要素の差が 1 であるかどうかを判断します。差が 1 の場合は、次の要素への再帰を続けます。差が 1 でない場合は、連続数値が終了し、前のレベルの再帰が返されることを意味します。
サンプルコードは次のとおりです。
function findConsecutiveNumbers($arr) { $res = array(); $n = count($arr); $i = 1; $j = 0; while($i < $n) { if($arr[$i] - $arr[$i-1] == 1) { $i++; } else { $tmp = array_slice($arr, $j, $i-$j); if(count($tmp)>1){ $res[] = $tmp; } $j = $i; $i++; } } $tmp = array_slice($arr, $j, $i-$j); if(count($tmp)>1){ $res[] = $tmp; } return $res; } $arr = [1, 2, 3, 5, 6, 7, 9]; $res = findConsecutiveNumbers($arr); print_r($res); //输出[[1,2,3],[5,6,7]]
要約:
上記の 3 つの方法により、配列の連続番号を簡単に見つけることができます。このうち、ループトラバーサル方式とソート方式の計算量は $O(nlogn)$、再帰方式の計算量は $O(n)$ です。したがって、データ量が多い場合には、再帰的手法の使用を優先することができます。
以上がPHPで配列の連続番号を見つける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。