在php开发中,处理数组时经常需要筛选出其中连续递增的片段,比如统计用户连续增长的积分记录、提取连续上升的销量数据等场景都会用到这个逻辑。下面介绍具体的实现步骤和完整代码。

实现思路
要筛选连续递增段,核心逻辑是遍历数组,记录当前递增段的起始位置和临时存储当前段的元素,当遇到不递增的元素时,将之前的递增段保存到结果中,然后重置临时变量继续遍历。具体步骤如下:
- 初始化结果数组,用于存储所有筛选出的连续递增段
- 初始化临时数组,用于存储当前正在遍历的连续递增段元素
- 遍历原数组,从第二个元素开始,对比当前元素和前一个元素的大小
- 如果当前元素大于前一个元素,将其加入临时数组
- 如果当前元素不大于前一个元素,说明当前递增段结束,将临时数组加入结果数组,然后重置临时数组,从当前元素开始新的递增段判断
- 遍历结束后,不要忘记将最后一段临时数组加入结果数组
完整代码实现
下面是封装好的筛选函数,支持处理索引数组,返回所有连续递增的片段:
<?php
/**
* 筛选php数组中连续递增的段
* @param array $arr 待处理的索引数组
* @return array 所有连续递增段的二维数组
*/
function filter_continuous_increment_segments($arr) {
// 数组为空或只有一个元素时,没有连续递增段,直接返回空数组
if (count($arr) <= 1) {
return [];
}
$result = []; // 存储最终结果
$temp_segment = [$arr[0]]; // 临时存储当前递增段,先放入第一个元素
// 从第二个元素开始遍历
for ($i = 1; $i < count($arr); $i++) {
// 当前元素大于前一个元素,属于连续递增
if ($arr[$i] > $arr[$i - 1]) {
$temp_segment[] = $arr[$i];
} else {
// 当前元素不递增,判断临时段长度是否大于等于2(至少两个元素才算段)
if (count($temp_segment) >= 2) {
$result[] = $temp_segment;
}
// 重置临时段,从当前元素开始新的判断
$temp_segment = [$arr[$i]];
}
}
// 遍历结束后处理最后一段
if (count($temp_segment) >= 2) {
$result[] = $temp_segment;
}
return $result;
}
// 测试用例
$test_arr = [1, 2, 3, 5, 4, 6, 7, 8, 2, 3];
$segments = filter_continuous_increment_segments($test_arr);
print_r($segments);
?>
代码说明
上述代码中,函数filter_continuous_increment_segments接收一个索引数组作为参数,首先判断数组长度,长度小于等于1时直接返回空数组。然后初始化临时数组放入第一个元素,从第二个元素开始遍历,每次对比当前元素和前一个元素的大小,满足条件就加入临时段,不满足条件就处理之前的临时段。最后遍历结束后还要处理最后一段未保存的递增段。
测试代码的输出结果如下:
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 5
)
[1] => Array
(
[0] => 4
[1] => 6
[2] => 7
[3] => 8
)
[2] => Array
(
[0] => 2
[1] => 3
)
)
边界情况处理
实际使用中可能会遇到一些边界场景,上面的代码已经做了对应处理:
- 数组为空或者只有一个元素时,返回空数组,因为没有连续的元素可以构成递增段
- 递增段至少包含两个元素才会被记录,单个元素不会作为递增段保存
- 如果数组整体都是连续递增的,会返回包含一个完整数组的结果
- 如果数组中没有连续递增的元素,会返回空数组
如果需要调整递增段的最小长度,比如要求至少3个元素才算有效递增段,只需要把代码中判断count($temp_segment) >= 2的地方改成count($temp_segment) >= 3即可,逻辑非常灵活。