PHP如何遍历数组筛选zX/X开头元素并完成数值区间校验
PHP匹配zX/X前缀元素并做区间校验实现方案
前置注意事项
你原有数组定义代码存在覆盖问题:for循环中对同一索引$i先后赋值zX.$i和X.$i,第一次写入的zX前缀值会被第二次的X前缀值覆盖,最终前201个元素仅会保留X前缀值,如果需要同时存储两类前缀元素,需要调整索引递增逻辑,下文示例代码已做对应修正。
核心实现思路
- 遍历全量数组元素,优先匹配2位长度的
zX前缀,再匹配1位长度的X前缀,跳过所有不符合前缀规则的元素 - 对匹配到前缀的元素,剥离前缀后提取后缀数字部分,转为整数类型
- 按照预设的数值区间做大小判断,归类合法/非法元素
完整实现代码
<?php // 修正后的数组定义:避免同索引值覆盖,同时保留zX、X两类前缀元素 $test = array(); $index = 0; for ($i = 0; $i < 201; $i++) { $test[$index++] = "zX" . strval($i); $test[$index++] = "X" . strval($i); } $test[201] = "zX1"; $test[202] = "zX2"; $test[203] = "zX3"; $test[204] = "zX4"; $test[205] = "zX5"; $test[206] = "zX6"; $test[207] = "zX7"; $test[208] = "zX8"; $test[209] = "zX9"; $test[211] = "X1"; $test[212] = "X2"; $test[213] = "X3"; $test[214] = "X4"; $test[215] = "X5"; $test[216] = "X6"; $test[217] = "X7"; $test[218] = "X8"; $test[219] = "X9"; // 存储校验结果 $checkResult = [ 'valid' => [], 'invalid' => [] ]; // 遍历校验 foreach ($test as $item) { $prefix = ''; $numVal = 0; // 优先匹配zX前缀(长度2),避免被X前缀误匹配 if (substr($item, 0, 2) === 'zX') { $prefix = 'zX'; $numVal = intval(substr($item, 2)); } elseif (substr($item, 0, 1) === 'X') { $prefix = 'X'; $numVal = intval(substr($item, 1)); } else { // 非目标前缀元素,直接跳过 continue; } // 区间校验:按照需求数字范围为1~9200,覆盖zX1/zX9/zX1200/zX9200所有边界 // 如果需要拆分更细的区间规则(比如1开头数字上限1200、9开头数字上限9200),直接修改此处判断条件即可 if ($numVal >= 1 && $numVal <= 9200) { $checkResult['valid'][] = $item; } else { $checkResult['invalid'][] = $item; } } // 按需输出结果查看 // print_r($checkResult);
关键细节说明
- 前缀判断使用
substr()做字符串截取,兼容PHP5.3及以上所有版本,无需依赖PHP8+才支持的str_starts_with()函数 - 后缀数字统一用
intval()转为整数再比较,避免字符串字典序比较的逻辑错误(比如字符串比较时"X1200" < "X9"会返回true,转整数后比较不会出现该问题) - 判断顺序优先匹配更长的
zX前缀,避免把zX开头的元素误识别为X前缀 - 非目标前缀的元素会被直接过滤,不会进入后续校验流程
内容的提问来源于stack exchange,提问作者PineappleBros
相关产品推荐
相关产品推荐

