foreach循环中in_array与array_intersect函数失效问题排查
解决邮政编码匹配问题
我来帮你排查并解决这个问题!你的代码里有几个关键逻辑问题导致in_array和array_intersect没生效,下面一步步拆解并修正:
核心问题分析
- 循环嵌套逻辑混乱:你在遍历
get_territories()的循环内部,每次添加一个地区到$zipcodes后立刻完整遍历一遍$zipcodes,这会导致重复检查,逻辑冗余且容易出错。 - return语句顺序错误:函数里先执行了
return 'User ZIP: '.$users_zipcode.'<br>';,这会直接终止函数运行,后面的return $results;永远不会被执行。 - 变量初始化缺失:
$results没有提前初始化,如果没有匹配到邮政编码,会触发未定义变量的警告。 - 严格类型匹配冲突:你用了
in_array的严格模式(第三个参数为TRUE),但如果$users_zipcode是整数类型(比如30004),而$value里的邮政编码是字符串类型(比如"30004"),严格比较会判定不匹配,直接导致判断失败。
修正后的代码
function display_zipcodes_raw() { // 先获取用户邮政编码并转成字符串,确保类型与目标数组一致 $users_zipcode = (string) CFGP_U::api('postcode'); $zipcodes = []; $results = ''; // 一次性整理所有地区的邮政编码数据 foreach (get_territories() as $territory) { $zipcodes[$territory['name']] = array_column(get_zipcodes($territory['id']), 'zip_code'); } // 遍历整理好的数组,查找匹配项 foreach ($zipcodes as $key => $value) { // 严格模式检查,确保类型与值都匹配 if (in_array($users_zipcode, $value, TRUE)) { $results .= '匹配到的地区: ' . $key . '<br>'; $results .= '该地区的邮政编码列表: '.json_encode($value).'<br><br>'; } } // 处理未匹配的情况 if (empty($results)) { $results = '未找到与用户邮政编码匹配的地区'; } // 组合最终输出内容 $output = '用户邮政编码: '.$users_zipcode.'<br><br>'; $output .= $results; return $output; }
关键改动说明
- 提前获取并转换用户邮编类型:把
$users_zipcode的获取移到循环外,避免重复调用API,同时转成字符串确保和目标数组里的邮编类型一致。 - 分离数据整理与匹配逻辑:先一次性把所有地区的邮编数据整理到
$zipcodes,再统一遍历查找匹配项,逻辑更清晰高效。 - 修复return语句问题:不再提前终止函数,而是组合所有输出内容后统一返回。
- 初始化$results变量:避免未定义变量的警告,同时补充了未匹配场景的提示。
如果想用array_intersect实现相同逻辑,也可以把匹配部分改成这样:
foreach ($zipcodes as $key => $value) { $intersection = array_intersect([$users_zipcode], $value); if (!empty($intersection)) { $results .= '匹配到的地区: ' . $key . '<br>'; $results .= '匹配的邮政编码: '.reset($intersection).'<br><br>'; } }
这个逻辑和in_array等价,只要类型一致就能正常生效。
内容的提问来源于stack exchange,提问作者Trisha
相关产品推荐
相关产品推荐

