如何高效将含整数值的关联数组映射到空值关联数组?
更简洁高效的数组映射方案
嘿,我懂你想要的效果——把第二个数组里匹配的州对应值映射到第一个全量州数组,不匹配的设为0,而且不想用嵌套循环那种啰嗦又低效的写法。其实PHP里用几个内置数组函数组合起来,就能优雅解决这个问题,代码更简洁,性能也更好!
核心思路
- 统一处理键的大小写问题(因为你的匹配是大小写不敏感的)
- 从第二个数组中过滤出仅存在于第一个数组的键值对
- 初始化全量州数组为全0,再用匹配到的键值对覆盖对应位置
具体实现代码
// 你的原始数组 $all_states = [ "Ontario" => null, "Manitoba" => null, "New Brunswick" => null, "Yukon" => null, "Saskatchewan" => null, "Prince Edward Island" => null, "Alberta" => null, "Quebec" => null, "Nova Scotia" => null, "British Columbia" => null, "Nunavut" => null, "Newfoundland and Labrador" => null, "Northwest Territories" => null ]; $country_states = [ "Alberta" => 17, "Cairo" => 1, "Calgary" => 1, "ddd" => 4, "gfdxf" => 1, "New Cairo" => 1, "Ontario" => 1, "secret" => 30 ]; // 步骤1:将两个数组的键转为小写,方便大小写不敏感匹配 $lower_all_states = array_change_key_case($all_states, CASE_LOWER); $lower_country_states = array_change_key_case($country_states, CASE_LOWER); // 步骤2:提取两个数组中键匹配的部分 $matched_items = array_intersect_key($lower_country_states, $lower_all_states); // 步骤3:初始化结果数组为全0 $result = array_fill_keys(array_keys($all_states), 0); // 步骤4:将匹配到的值对应回原数组的正确键(恢复原大小写) $lower_all_keys = array_change_key_case(array_keys($all_states), CASE_LOWER); foreach ($matched_items as $lower_key => $value) { // 找到原数组中对应的键的位置 $key_index = array_search($lower_key, $lower_all_keys); if ($key_index !== false) { $original_key = array_keys($all_states)[$key_index]; $result[$original_key] = $value; } } // 输出结果 print_r($result);
为什么这个方案更好?
- 性能更优:PHP的内置数组函数都是底层C实现的,比手动写嵌套循环(时间复杂度O(n*m))效率高得多,尤其是数组元素较多时差异明显
- 代码更简洁:逻辑清晰,每一步都有明确的目的,可读性更强
- 避免重复赋值:原嵌套循环中会多次给未匹配项设为0,这个方案只初始化一次全0,再覆盖匹配项,没有冗余操作
内容的提问来源于stack exchange,提问作者sc0rp10n.my7h
相关产品推荐
相关产品推荐

