
php 数组不允许重复键,因此无法直接用单层关联数组表示“allison”中两个 l 都映射为 3 的结果;正确做法是将每个字符→数字的映射封装为独立子数组,形成索引数组嵌套关联结构。
php 数组不允许重复键,因此无法直接用单层关联数组表示“allison”中两个 l 都映射为 3 的结果;正确做法是将每个字符→数字的映射封装为独立子数组,形成索引数组嵌套关联结构。
在 PHP 中,关联数组的键必须唯一——这是语言底层限制。当你尝试构造类似 [L => 3, L => 3] 的结构时,后一个 L 会直接覆盖前一个,最终只剩一个 L => 3。这也是原代码使用 array_intersect_key 后只得到一个 L 的根本原因:它基于键匹配,而输入字符串 "ALLISON" 经 str_split 后虽含两个 'L',但 array_flip($nameArr) 会因键冲突丢失重复项(第二个 'L' 覆盖第一个)。
要完整保留原始字符串中每个字符及其对应数值(含重复),应放弃“单层关联数组”的思路,转而构建索引数组,其每个元素是一个长度为 1 的关联子数组。这样既维持了字符与数值的语义映射,又规避了键冲突问题。
以下是优化后的实现方案:
<?php $name = 'ALLISON';
function toNumber($name) {
$nameArr = str_split(strtoupper($name)); // 确保大写,增强健壮性
$convertArr = [
'A'=>'1', 'J'=>'1', 'S'=>'1',
'B'=>'2', 'K'=>'2', 'T'=>'2',
'C'=>'3', 'L'=>'3', 'U'=>'3',
'D'=>'4', 'M'=>'4', 'V'=>'4',
'E'=>'5', 'N'=>'5', 'W'=>'5',
'F'=>'6', 'O'=>'6', 'X'=>'6',
'G'=>'7', 'P'=>'7', 'Y'=>'7',
'H'=>'8', 'Q'=>'8', 'Z'=>'8',
'I'=>'9', 'R'=>'9'
];
return array_reduce($nameArr, function ($carry, $char) use ($convertArr) {
// 检查字符是否存在映射,避免未定义索引警告
$value = $convertArr[$char] ?? null;
if ($value !== null) {
$carry[] = [$char => $value];
}
return $carry;
}, []);
}
$result = toNumber($name);
print_r($result);
?>
输出结果:
Array
(
[0] => Array
(
[A] => 1
)
[1] => Array
(
[L] => 3
)
[2] => Array
(
[L] => 3
)
[3] => Array
(
[I] => 9
)
[4] => Array
(
[S] => 1
)
[5] => Array
(
[O] => 6
)
[6] => Array
(
[N] => 5
)
)
✅ 关键优势:
- 完整保留原始字符顺序与重复信息;
- 每个映射关系清晰隔离,无键冲突风险;
- 支持后续灵活处理(如遍历提取所有值:array_column($result, 'L') 或批量获取数值:array_column($result, 0))。
⚠️ 注意事项:
- 不要试图用 array_merge 或 + 合并多个 ['L' => 3] —— 这仍会导致键覆盖;
- 若需扁平化数值列表(如 [1,3,3,9,1,6,5]),可用 array_column(array_merge(...$result), 0);
- 建议添加字符存在性校验(如上例中的 ?? null),防止对非字母字符报错。
这种“数组套数组”的模式是 PHP 中表达多重相同键映射的标准实践,兼顾语义准确性和运行时安全性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











