在 PHP 中处理数组时,array_change_key_case() 和 array_merge() 都是非常常用的函数。一个可以将数组的键统一转为大小写,另一个则用于合并数组。看上去两者都很简单直接,但当它们时,却很容易踩坑,特别是在处理时。
array_change_key_case(array $array, int $case = CASE_LOWER): 将数组的所有键名转换为小写或大写。
array_merge(array ...$arrays): 合并一个或多个数组。
PHP 中数组的键名在某些函数中会表现出不同的“敏感度”——比如 array_merge() 是区分大小写的,而 array_change_key_case() 会统一大小写。这就可能导致合并时出现“重复键未覆盖”或“意外覆盖”的问题。
$arr1 = ['Name' => 'Alice'];
$arr2 = ['name' => 'Bob'];
$result = array_merge(
array_change_key_case($arr1, CASE_LOWER),
array_change_key_case($arr2, CASE_LOWER)
);
print_r($result);
Array
(
[name] => Bob
)
看起来正常,对吧?因为我们都统一为小写了。但是如果你换个顺序:
$result = array_merge(
array_change_key_case($arr2, CASE_LOWER),
array_change_key_case($arr1, CASE_LOWER)
);
Array
(
[name] => Alice
)
注意:覆盖的值不同了!
这说明当你在使用 array_merge() 和 array_change_key_case() 时,处理顺序会直接影响结果。
$arr1 = ['Name' => 'Alice'];
$arr2 = ['name' => 'Bob'];
$result = array_change_key_case(
array_merge($arr1, $arr2), CASE_LOWER
);
print_r($result);
Array
(
[name] => Bob
)
在这个例子中,虽然合并时 array_merge() 视 Name 和 name 为两个不同的键,合并后才统一成小写,这样就只保留了后者 Bob,也就是“看似重复但其实两个键都存在合并时”。
而你可能原本的意图是希望以某个键为主来合并,这种写法就可能产生非预期行为。
为了避免这些坑,建议在使用这两个函数时遵循以下规则:
先统一键名大小写再合并:
$result = array_merge(
array_change_key_case($arr1, CASE_LOWER),
array_change_key_case($arr2, CASE_LOWER)
);
确保数据源中键的大小写风格一致: 最好在数据生成或来源阶段就统一大小写标准。
考虑使用 array_replace() 替代 array_merge(): 在某些场景中,array_replace() 更符合“键覆盖”的逻辑。
$result = array_replace(
array_change_key_case($arr1, CASE_LOWER),
array_change_key_case($arr2, CASE_LOWER)
);
array_merge() 是区分键名大小写的;
array_change_key_case() 是用来统一键名大小写的;
两者结合使用时,先后顺序和键的原始大小写都会影响最终结果;
实际开发中,切记在合并之前先做大小写转换,才能避免数据“意外丢失”。
在多系统或多源数据合并的应用场景,比如接口聚合(如 https://api.m66.net/userinfo 和 https://api.m66.net/userdetail),就特别容易出现这种坑。如果你不提前处理好大小写,一不小心就可能把关键字段给“覆盖”掉了还不自知。
希望这篇文章能帮你避坑!