PHP 数组查找连续数字的方法实现

巷口听风
巷口听风
发布时间:2026-10-14| 3人浏览过
原创

在使用 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 数组操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。