如何用数组中对应键的值替换字符串内的内容?
分号分隔字符串替换为数组对应值的高效方法
问题场景
我有一个分号分隔的字符串:
$str = 'value 12; another value; yet one more one; val5';
还有一个数组,它的键正好和上述字符串里的各个值一一对应,现在需要把字符串中的每个值替换成数组里对应的键值。
目前我想到的思路是先拆分字符串并去除每个项的空格:
$arr = array_map('trim', explode(';', $str));
想问下必须要遍历这个数组,把值当键取对应内容再重新拼接吗?有没有更高效的办法?
解决方案
方法一:用strtr()一步到位(效率最高)
PHP自带的strtr()函数天生就是干批量字符串替换的,完全不用手动拆分拼接,直接搞定:
- 先准备好你的映射数组(键是原字符串里的值,值是你要替换成的内容):
$replaceMap = [ 'value 12' => '结果12', 'another value' => '结果_其他', 'yet one more one' => '结果_更多', 'val5' => '结果5' ];
- 先把原字符串里的分隔符统一处理下,避免因为空格导致匹配失败:
// 把分号前后的任意空格换成单纯的分号,确保每个项和映射数组的键完全匹配 $cleanStr = preg_replace('/\s*;\s*/', ';', $str);
- 直接调用
strtr()完成替换,要是需要保留原有的分号加空格格式,再替换回去就行:
$result = strtr($cleanStr, $replaceMap); // 恢复分号加空格的分隔格式 $result = str_replace(';', '; ', $result);
方法二:优化你现有的拆分思路
如果更习惯自己的拆分逻辑,也不用手动遍历,用array_map就能快速处理:
$arr = array_map('trim', explode(';', $str)); $replaceMap = [/* 你的映射数组 */]; // 批量取对应值,用?? $item保证不存在的键保留原内容 $replacedArr = array_map(function($item) use ($replaceMap) { return $replaceMap[$item] ?? $item; }, $arr); // 重新拼接成字符串 $result = implode('; ', $replacedArr);
效率对比
strtr()是PHP底层实现的批量替换,当字符串较长、映射项多的时候,性能优势非常明显。- 拆分拼接的方式逻辑更直观,但性能略差一点,适合简单场景。
内容的提问来源于stack exchange,提问作者santa
相关产品推荐
相关产品推荐

