You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效将含整数值的关联数组映射到空值关联数组?

更简洁高效的数组映射方案

嘿,我懂你想要的效果——把第二个数组里匹配的州对应值映射到第一个全量州数组,不匹配的设为0,而且不想用嵌套循环那种啰嗦又低效的写法。其实PHP里用几个内置数组函数组合起来,就能优雅解决这个问题,代码更简洁,性能也更好!

核心思路

  1. 统一处理键的大小写问题(因为你的匹配是大小写不敏感的)
  2. 从第二个数组中过滤出仅存在于第一个数组的键值对
  3. 初始化全量州数组为全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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:12:52