PHP使用array_merge合并数组时数值索引被重置该如何解决
PHP合并数组保留原索引、重复键保留先出现值的解决方案
问题根因
你遇到的索引重置问题是array_merge()函数的固有特性:
- 处理字符串类型键名时,后传入的数组同键值会覆盖先传入数组的值
- 处理数字/数字字符串类型键名时,会直接丢弃原索引,统一从0开始重新编号
这两点刚好与你的需求完全相悖。
解决方案
直接使用PHP数组的+运算符替换array_merge()即可,+运算符的规则完全匹配你的需求:
- 无论键是字符串类型还是数字类型,都会原样保留原索引,不会做重排处理
- 两个数组出现同键名时,永远保留左侧数组(先出现)的值,右侧数组(后出现)的同键值会被自动忽略
修改后的代码
foreach ($options as $key => $option) { $optionName = $option->{"attributeName"}; $subOptions = array_flip($option->{"predefinedStringValues"}); if (!isset($optionList[$optionName])) { $optionList[$optionName] = $subOptions; } else { // 仅修改这一行即可,注意已有数组要放在+左侧,新数组放右侧 $optionList[$optionName] = $optionList[$optionName] + $subOptions; } }
效果验证
用你给出的示例数组计算Array1 + Array2,输出结果与你期望的Array4完全一致:
- 重复键
Onesize保留Array1中的值2,不会被Array2中的0覆盖 - Array2中的数字键
24、25、26等全部保留原键名,不会被重新编号
内容的提问来源于stack exchange,提问作者Grimclaw Draven
相关产品推荐
相关产品推荐

