PHP7.4有没有比isset加三元运算更优的数组与字符串值校验方案?
PHP数组非空字符串取值逻辑优化方案
原代码的核心逻辑是按优先级取第一个存在且为非空字符串的值,优先级顺序为:
$params['applicant']['name']$simulationCustomer['fullname']$simulationCustomer['name']
全部不符合时返回空字符串。以下是几种更易读的实现方式:
方案1:封装通用工具函数(兼容全PHP版本,可复用性最高)
封装统一的取值函数,后续同类逻辑都可以直接调用,调用侧代码可读性极强:
/** * 按优先级取第一个存在且为非空字符串的数组值 * @param array $candidates 候选配置,每一项格式为[目标数组, 键路径数组] * @param string $default 兜底默认值 * @return string */ function get_first_non_empty_string(array $candidates, string $default = ''): string { foreach ($candidates as [$targetArr, $keyPath]) { $value = $targetArr; foreach ($keyPath as $key) { if (!isset($value[$key])) { $value = null; break; } $value = $value[$key]; } if (is_string($value) && $value !== '') { return $value; } } return $default; }
调用代码:
$applicantName = get_first_non_empty_string([ [$params, ['applicant', 'name']], [$simulationCustomer, ['fullname']], [$simulationCustomer, ['name']] ]);
优势:支持任意深度的数组取值,优先级顺序直观清晰,后续新增取值优先级只需要加一行配置即可。
方案2:平铺if-else写法(无需封装,适配所有场景)
如果不想单独封装工具函数,直接把嵌套三元改成平铺的if-else判断,逻辑顺序完全和优先级对应,没有嵌套成本:
$applicantName = ''; if (isset($params['applicant']['name']) && $params['applicant']['name'] !== '') { $applicantName = $params['applicant']['name']; } elseif (isset($simulationCustomer['fullname']) && $simulationCustomer['fullname'] !== '') { $applicantName = $simulationCustomer['fullname']; } elseif (isset($simulationCustomer['name'])) { $applicantName = $simulationCustomer['name']; }
方案3:empty简化写法(仅适用于特定业务场景)
如果业务中不可能出现'0'这类被empty()判定为空的合法姓名字符串,可以用empty()简化判断:
// 注意:业务姓名不会为'0'时才可使用,否则会误过滤合法值 $applicantName = !empty($params['applicant']['name']) ? $params['applicant']['name'] : (!empty($simulationCustomer['fullname']) ? $simulationCustomer['fullname'] : ($simulationCustomer['name'] ?? ''));
内容的提问来源于stack exchange,提问作者JorgeeFG
相关产品推荐
相关产品推荐

