
本文介绍如何使用 array_map() 配合自定义截取函数,精准处理二维关联数组中特定键(如 'name')的字符串值,实现多语言安全的截断与省略号拼接。
本文介绍如何使用 array_map() 配合自定义截取函数,精准处理二维关联数组中特定键(如 'name')的字符串值,实现多语言安全的截断与省略号拼接。
在 PHP 开发中,常需对二维数组中某字段(如菜单项的 'name')统一进行字符串截取并添加省略符(如 ...)。由于涉及中文等多字节字符,必须使用 mb_* 系列函数确保兼容性,而不能依赖 substr() 或 strlen()。
以下是一个完整、健壮的解决方案:
✅ 核心思路
遍历二维数组的每一项(每个子数组),仅对存在 'name' 键的元素调用截取函数,并将结果重新赋值回原键,其余键值保持不变。
✅ 完整示例代码
<?php function cutString(string $string, int $length, string $appends): string
{
if (mb_strlen($string, 'UTF-8') <= $length) {
return $string;
}
// 使用 mb_strimwidth:自动处理多字节边界,避免乱码
return mb_strimwidth($string, 0, $length, $appends, 'UTF-8');
}
// 原始二维数组
$arr = [
['name' => 'Home page', 'sort' => 1, 'path' => '/'],
['name' => 'Сatalog', 'sort' => 110, 'path' => '/catalog/'],
['name' => 'Set of letters 1', 'sort' => 10, 'path' => '/section1/'],
['name' => 'Set of letters 2', 'sort' => 9, 'path' => '/section2/'],
['name' => 'Set of letters 3', 'sort' => 9200, 'path' => '/section3/'],
];
// 批量处理:仅修改每个子数组中的 'name' 字段
$length = 5;
$appends = '...';
$result = array_map(
function ($item) use ($length, $appends) {
if (isset($item['name'])) {
$item['name'] = cutString($item['name'], $length, $appends);
}
return $item; // 必须返回整个子数组
},
$arr
);
print_r($result);
⚠️ 注意事项
- 编码明确性:mb_strimwidth() 第五个参数应显式传入 'UTF-8',避免因 mb_internal_encoding() 设置不一致导致异常;
- 键存在性检查:使用 isset($item['name']) 而非 array_key_exists(),兼顾性能与语义(空字符串也应被截取);
- 不可变原则:array_map() 返回新数组,原始 $arr 不会被修改——如需就地修改,可改用 foreach 循环 + 引用;
- 长度单位:$length 指 显示宽度(字符数),非字节数,适用于中英文混合场景。
✅ 输出效果(符合预期)
[ ['name' => 'Home ...', 'sort' => 1, 'path' => '/'], ['name' => 'Сatal...', 'sort' => 110, 'path' => '/catalog/'], ['name' => 'Set o...', 'sort' => 10, 'path' => '/section1/'], // … 其余同理 ]
该方案简洁、可复用、支持国际化,是处理后台菜单、列表标题等场景的理想实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











