PHP 数组查找连续数字的方法实现
在使用 PHP 处理数据时,经常需要从一个多维数组中提取具有特定顺序关系的元素,例如查找连续的整数序列。虽然原生函数没有直接提供“查找连续子序列”的功能,但可以通过简单的循环遍历结合差值判断来实现。本文将分析一种基于二维数组的搜索逻辑,展示如何识别水平及垂直方向上的连续数值。
问题分析与核心逻辑
要在一个二维数组(类似表格)中查找连续数,通常涉及以下几个步骤:首先确保数据是有序的,因为无序数据无法通过简单的相邻索引比较来确定连续性;其次明确搜索的方向,常见的包括水平方向(行内)和垂直方向(列内)。
以下代码示例试图在一个包含多组数据的二维数组中,找出连续出现至少 3 个数的组合。其核心思路是利用 for 循环遍历数组元素,并检查当前元素与前两个元素的数值关系是否满足连续条件(即 $arr[$i] - $arr[$i-1] == 1 且 $arr[$i-1] - $arr[$i-2] == 1)。
代码实现细节
为了实现这一功能,我们需要构建一个能够接收二维数组并返回结果的函数结构。以下是经过梳理后的主要逻辑模块:
第1步:准备测试数据
首先定义一个二维数组 $data,其中每个子数组代表一行数据。为了便于寻找连续数,数据在存入时应当保持升序排列。如果原始数据无序,必须先调用 sort($arr, SORT_NUMERIC) 进行排序。
$data = array();
// 每一行数据应保持有序,以便后续判断连续性
$data[] = array("01", "02", "18", "29", "31", "32");
$data[] = array("02", "09", "11", "22", "24", "27");
$data[] = array("07", "16", "26", "27", "29", "31");
// ... 其他数据行
第2步:封装水平方向连续数检查
定义一个全局数组变量用于暂存找到的连续序列。通过遍历当前行的每一个元素,检查它是否与前两个元素构成连续数列。如果满足条件,则将其加入结果集中。
$h = array(); // 保存水平方向上的搜寻结果
function check_h($arr, $rownum) {
global $h;
// 确保数组至少有3个元素
if (count($arr) < 3) return;
// 对数据进行数值排序,保证连续性判断准确
sort($arr, SORT_NUMERIC);
$consecutiveCount = 1; // 记录当前连续长度
$currentSequence = array($arr[0]);
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] == $arr[$i-1] + 1) {
$consecutiveCount++;
$currentSequence[] = $arr[$i];
} else {
// 如果不连续,检查之前的序列是否达到3个或以上
if ($consecutiveCount >= 3) {
$h[$rownum] = $currentSequence;
}
// 重置计数器和新序列
$consecutiveCount = 1;
$currentSequence = array($arr[$i]);
}
}
// 检查最后一组是否满足条件
if ($consecutiveCount >= 3) {
$h[$rownum] = $currentSequence;
}
}
第3步:封装垂直方向连续数检查
垂直方向的检查涉及跨行的索引访问。这需要外层循环遍历列索引,内层循环遍历行索引,对比同一列上下相邻的行数据。此过程较为复杂,需特别注意边界条件,防止数组越界。
$v = array(); // 保存竖直方向上的搜寻结果
function check_v($sourceArr2D, $colIndex) {
global $v;
$rowCount = count($sourceArr2D);
if ($rowCount < 3) return;
// 提取该列的所有值并按行号关联
$columnValues = array();
for ($r = 0; $r < $rowCount; $r++) {
// 注意:这里假设每行的元素个数足够覆盖 colIndex
if (isset($sourceArr2D[$r][$colIndex])) {
$val = $sourceArr2D[$r][$colIndex];
// 由于不同行的对应位置不一定连续,通常需要提取该列所有非空值后重新排序判断
// 此处仅为示意逻辑,实际工程中建议先整理成独立的一维数组再查连续
$columnValues[] = array('row' => $r, 'val' => $val);
}
}
// 简化逻辑:若严格指几何位置连续(Row i, Row i+1, Row i+2 在同一Col),则如下判断:
for ($i = 2; $i < $rowCount; $i++) {
$valCur = $sourceArr2D[$i][$colIndex];
$valPrev = $sourceArr2D[$i-1][$colIndex];
$valPrev2 = $sourceArr2D[$i-2][$colIndex];
if ($valCur == $valPrev + 1 && $valPrev == $valPrev2 + 1) {
// 找到连续的三个垂直坐标
$v[] = array(
$sourceArr2D[$i-2],
$sourceArr2D[$i-1],
$sourceArr2D[$i]
);
}
}
}
第4步:整合执行流程
在主程序中,遍历二维数组的每一行,调用水平检查函数;同时遍历列索引,调用垂直检查函数。最终输出统计结果。
// 执行检查
foreach ($data as $rowIndex => $rowData) {
check_h($rowData, $rowIndex);
}
foreach ($data[0] as $key => $colData) { // 假设第一行定义了列数
check_v($data, $key);
}
// 输出结果
print_r($h);
print_r($v);
注意事项与优化建议
原文提供的代码片段中存在若干语法错误(如 (...)$val 的非标准连接符)以及逻辑不完整的情况(如 check_l 和 check_r 为空)。上述重构方案修正了这些错误,并提供了更健壮的连续数检测逻辑。
- 排序重要性:在进行连续性判断前,务必对参与比较的数据进行排序,否则相邻索引不代表数值大小相邻。
- 边界处理:在遍历行列时,必须确认索引存在,避免
Undefined offset警告。 - 动态扩展:如果需要查找 4 个或更多连续数,只需将判断阈值从
>= 3调整为>= n即可。
以上就是 PHP 数组比较实现查找连续数的详细内容,更多关于 PHP 数组操作的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













