PHP按键名后缀合并数组:是否有原生函数可实现?
按键名后缀合并PHP数组的解决方案
嘿,这个需求确实有点特定——先说结论:PHP没有专门做「按键名后缀匹配合并」的原生函数,毕竟原生函数大多覆盖通用的数组合并场景(比如完全键名匹配、递归合并),而你需要的是「键名带统一前缀,后缀对应值数组的键」这种定制化匹配。
你提到的array_merge_recursive确实满足不了需求,因为它是基于完全相同的键名来合并的:你的$keys里的键是staff_first_name,而$submitted_values里是first_name,键名完全不匹配,自然没法对应赋值。
不过我们可以用PHP的基础原生函数组合实现,比写复杂的自定义函数更简洁:
方法一:直观循环遍历
这种方式逻辑清晰,容易理解和调整:
$keys = array( 'staff_first_name' => NULL, 'staff_last_name' => NULL, 'staff_years' => NULL ); $submitted_values = array( 'first_name' => 'jon', 'last_name' => 'doe', 'years' => 5 ); $wanted_array = []; $prefix = 'staff_'; $prefix_len = strlen($prefix); foreach ($keys as $full_key => $default_val) { // 提取键名的后缀部分(去掉前缀) $suffix = substr($full_key, $prefix_len); // 用null合并运算符,优先取提交的值,没有则保留原默认值 $wanted_array[$full_key] = $submitted_values[$suffix] ?? $default_val; } // 输出结果:Array ( [staff_first_name] => jon [staff_last_name] => doe [staff_years] => 5 ) print_r($wanted_array);
方法二:函数式风格(array_map + array_combine)
如果偏好更紧凑的函数式写法,可以用这几个原生函数组合:
$keys = array( 'staff_first_name' => NULL, 'staff_last_name' => NULL, 'staff_years' => NULL ); $submitted_values = array( 'first_name' => 'jon', 'last_name' => 'doe', 'years' => 5 ); $prefix = 'staff_'; $prefix_len = strlen($prefix); // 提取所有完整键的后缀 $suffixes = array_map(function($key) use ($prefix_len) { return substr($key, $prefix_len); }, array_keys($keys)); // 对应取出提交的值,无则保留原默认值 $values = array_map(function($suffix) use ($submitted_values, $keys) { return $submitted_values[$suffix] ?? $keys[sprintf('staff_%s', $suffix)]; }, $suffixes); // 合并成目标数组 $wanted_array = array_combine(array_keys($keys), $values); // 输出结果和上面一致 print_r($wanted_array);
两种方法都利用了PHP的原生工具函数,没有额外依赖,而且可以轻松调整前缀、默认值处理逻辑,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Orlando P.
相关产品推荐
相关产品推荐

