如何让PHP for循环遇未定义数组键错误时继续执行匹配逻辑
问题根因
- PHP 8.0及以上版本中,访问未定义数组键抛出的是
Error类型错误,不属于Exception子类,你仅捕获Exception无法触发catch分支,所以代码不生效。 - 该场景属于常规的数组键存在性判断,无需使用异常捕获,用
isset判断性能更高、逻辑更清晰。
优化方案(推荐)
直接判断键是否存在,避免抛出错误,同时复用重复代码,修复原代码遗漏的输出和终止逻辑:
// 提前计算数组长度,避免循环中重复计算 $resultCount = count($decode['results']); for ($i = 0; $i < $resultCount; $i++){ $components = $decode['results'][$i]['components']; $isMatched = false; // 优先匹配ISO字段 if (isset($components['ISO_3166-1_alpha-2']) && $components['ISO_3166-1_alpha-2'] === $_REQUEST['isoCode']) { $isMatched = true; } // ISO字段不存在或不匹配时, fallback到country_code elseif (isset($components['country_code']) && $components['country_code'] === $_REQUEST['isoCode']) { $isMatched = true; } if ($isMatched) { $output['status']['code'] = "200"; $output['status']['name'] = "ok"; $output['status']['description'] = "success"; $output['status']['returnedIn'] = intval((microtime(true) - $executionStartTime) * 1000) . " ms"; $output['data'] = $decode['results'][$i]; header('Content-Type: application/json; charset=UTF-8'); echo json_encode($output); // 匹配到直接终止执行,无需继续遍历 exit; } }
异常捕获写法修正(仅作参考,不推荐生产使用)
如果一定要用try catch结构,需要将捕获对象改为覆盖所有错误和异常的Throwable:
$resultCount = count($decode['results']); for ($i = 0; $i < $resultCount; $i++){ try{ if ($decode['results'][$i]['components']['ISO_3166-1_alpha-2'] === $_REQUEST['isoCode']){ $output['status']['code'] = "200"; $output['status']['name'] = "ok"; $output['status']['description'] = "success"; $output['status']['returnedIn'] = intval((microtime(true) - $executionStartTime) * 1000) . " ms"; $output['data'] = $decode['results'][$i]; header('Content-Type: application/json; charset=UTF-8'); echo json_encode($output); exit; } } catch (Throwable $e) { if ($decode['results'][$i]['components']['country_code'] === $_REQUEST['isoCode']){ $output['status']['code'] = "200"; $output['status']['name'] = "ok"; $output['status']['description'] = "success"; $output['status']['returnedIn'] = intval((microtime(true) - $executionStartTime) * 1000) . " ms"; $output['data'] = $decode['results'][$i]; header('Content-Type: application/json; charset=UTF-8'); echo json_encode($output); exit; } } }
注意:原代码存在两处疏漏:1. 赋值完
$output后没有执行echo json_encode($output)输出返回内容;2. 没有终止执行逻辑,匹配到结果后仍会继续遍历,甚至最终返回空响应,以上代码已修复该问题。
内容的提问来源于stack exchange,提问作者HJP
相关产品推荐
相关产品推荐

