处理薪资字符串时Neg/NEG分支触发数组键未定义错误
问题解析与修复
问题场景
解析JSON返回的薪资数据时,遇到三种格式:带/annum//hour//day后缀的金额、£NEG、空值。现有PHP代码处理带后缀格式和空值时正常,但处理£NEG时触发Undefined array key 1警告和str_replace()传null的废弃提示。
错误原因
- 条件判断逻辑错误:判断薪资是否为可协商的代码写法完全错误:
这行代码的逻辑运算优先级和写法都存在问题,导致if(strpos($jobs['salary'],'Neg'||'NEG' !== false))£NEG无法被正确识别,程序错误地进入else分支执行preg_split。 - 数组索引越界:
£NEG中没有匹配到/hour//annum//day后缀,preg_split返回的数组只有一个元素(索引0),此时访问$chunks[1]就会触发数组键不存在的警告,同时给str_replace()传null触发废弃提示。
修复后的代码
if(!empty($jobs['salary'])) { // 修正判断逻辑:不区分大小写检查是否包含Neg if(stristr($jobs['salary'], 'Neg') !== false) { $salary = 'Negotiable'; $salarytype = ''; } else { $chunks = preg_split('/(\/hour|\/annum|\/day)/', $jobs['salary'], -1, PREG_SPLIT_DELIM_CAPTURE); $salarya = $chunks[0]; $salary = str_replace('£','£',$salarya); // 先判断数组是否存在索引1,避免报错 $salarytype = isset($chunks[1]) ? str_replace('/',' per ',$chunks[1]) : ''; } } else { $salary = 'Not Specified'; $salarytype = ''; } echo $salary . $salarytype . '<br>';
关键修复点
- 用
stristr()替代错误的strpos写法,实现不区分大小写的匹配,确保£NEG能被正确识别进入对应分支。 - 在访问
$chunks[1]前增加isset()判断,即使后续出现未匹配到后缀的其他格式,也不会触发报错。
内容的提问来源于stack exchange,提问作者Complete Noob
相关产品推荐
相关产品推荐

