对于 PHP 7.4,有没有比 isset 和 ternary 更好的方法? (数组值和字符串值检查)
Is there a better approach than isset and ternary for PHP 7.4? (array value and string value check)
$applicantName = (isset($params['applicant']['name']) && $params['applicant']['name'] != '') ? $params['applicant']['name'] :
((isset($simulationCustomer['fullname']) && $simulationCustomer['fullname'] != '') ? $simulationCustomer['fullname'] :
($simulationCustomer['name'] ?? ''));
我今天就是这个代码,当然感觉不对。在 JavaScript 中会更容易编写,PHP 中的问题是合并运算符仅适用于空值。
有没有办法写得更容易理解?
如果您只想检查变量是否已设置,您可以使用 ??
空合并运算符。但是如果你想把 ''
当作未设置的,你需要使用 !empty()
,这就排除了使用任何条件简写。您能做的最好的事情就是将 isset()
和 != ''
测试组合成 !empty()
$applicantName = !empty($params['applicant']['name']) ? $params['applicant']['name'] :
(!empty($simulationCustomer['fullname']) ? $simulationCustomer['fullname'] :
($simulationCustomer['name'] ?? ''));
使用array_filter
怎么样?
$applicantName = array_values(array_filter([
$params['applicant']['name'] ?? '',
$simulationCustomer['fullname'] ?? ''
]))[0] ?? '';
array_values
仅用于重置索引键。
或者
$names = array_filter([
$params['applicant']['name'] ?? '',
$simulationCustomer['fullname'] ?? ''
]);
$applicantName = reset($names) ?: '';
$applicantName = (isset($params['applicant']['name']) && $params['applicant']['name'] != '') ? $params['applicant']['name'] :
((isset($simulationCustomer['fullname']) && $simulationCustomer['fullname'] != '') ? $simulationCustomer['fullname'] :
($simulationCustomer['name'] ?? ''));
我今天就是这个代码,当然感觉不对。在 JavaScript 中会更容易编写,PHP 中的问题是合并运算符仅适用于空值。
有没有办法写得更容易理解?
如果您只想检查变量是否已设置,您可以使用 ??
空合并运算符。但是如果你想把 ''
当作未设置的,你需要使用 !empty()
,这就排除了使用任何条件简写。您能做的最好的事情就是将 isset()
和 != ''
测试组合成 !empty()
$applicantName = !empty($params['applicant']['name']) ? $params['applicant']['name'] :
(!empty($simulationCustomer['fullname']) ? $simulationCustomer['fullname'] :
($simulationCustomer['name'] ?? ''));
使用array_filter
怎么样?
$applicantName = array_values(array_filter([
$params['applicant']['name'] ?? '',
$simulationCustomer['fullname'] ?? ''
]))[0] ?? '';
array_values
仅用于重置索引键。
或者
$names = array_filter([
$params['applicant']['name'] ?? '',
$simulationCustomer['fullname'] ?? ''
]);
$applicantName = reset($names) ?: '';