php - 使用数组中的值更改字符串的一部分,但仅当可以找到整个值时
问题描述
我必须将多个国家名称的字符串替换为另一种语言的翻译。所以我创建了一系列国家,其中键是英语国家,值是目标语言的国家......
所以,让我先放一个我使用的数组的相关摘录:
$countries = array(
//...
'Canada' => 'Καναδάς',
//...
'France' => 'Γαλλία',
//...
'Germany' => 'Γερμανία',
//...
'Korea' => 'Κορέα',
//...
'South Korea' => 'Νότια Κορέα',
//...
'United States' => 'Ηνωμένες Πολιτείες',
//...
'West Germany' => 'Δυτική Γερμανία',
//...
);
我使用的代码是这样的:
$tmp[] = str_replace(array_keys($countries), $countries, $api->getCountry());
下面是两个(特殊情况)示例,它们让我很难弄清楚如何处理它们......
West Germany • France
United States • Canada • South Korea
所以上面两个例子被替换成这样:
West Γερμανία • Γαλλία
Ηνωμένες Πολιτείες • Καναδάς • South Κορέα
我认为这里发生的事情很明显......关键德国在关键西德之前找到,所以 str_replace 用它的翻译名称替换德国部分,所以西方仍然没有翻译......韩国也是如此,它(按字母顺序)恰好在韩国之前...
将西德和韩国移到德国和韩国之上可以解决问题,但我认为这不是处理这个问题的正确方法,因为它会发生在东德,一般来说,任何其他有两个词的国家,等等...
在您看来,处理这个问题的正确方法是什么?TIA
解决方案
这有点作弊,但是如果您要使用 array_keys 而不是循环,则应该按长度对国家/地区数组进行预排序。
$keys = array_map('strlen', array_keys($countries));
array_multisort($keys, SORT_DESC, $countries);
$tmp[] = str_replace(array_keys($countries), $countries, $api->getCountry());
这是您可以在以下位置测试的一个小示例:https ://www.tehplayground.com/uARSRel47jYICSIA
$countries = array(
'Canada' => 'Καναδάς',
'France' => 'Γαλλία',
'Germany' => 'Γερμανία',
'Korea' => 'Κορέα',
'South Korea' => 'Νότια Κορέα',
'United States' => 'Ηνωμένες Πολιτείες',
'West Germany' => 'Δυτική Γερμανία'
);
$keys = array_map('strlen', array_keys($countries));
array_multisort($keys, SORT_DESC, $countries);
echo str_replace(array_keys($countries), $countries, "West Germany"). "\n";
echo str_replace(array_keys($countries), $countries, "France") . "\n";
echo str_replace(array_keys($countries), $countries, "United States") . "\n";
echo str_replace(array_keys($countries), $countries, "Canada") . "\n";
echo str_replace(array_keys($countries), $countries, "South Korea") . "\n";
输出:
Δυτική Γερμανία
Γαλλία
Ηνωμένες Πολιτείες
Καναδάς
Νότια Κορέα
更新
事实证明uksort
在一行中处理了这一点:
uksort($countries,function($a, $b) { return strlen($b) > strlen($a);});
推荐阅读
- python - Python:以树状结构提取 MS Word 数据
- reactjs - 如何将反应静态 scss 实施到项目中?
- php - 搜索链接并添加后缀
- python-3.x - 基于另一个列字符串值的值创建新的数据框列
- html - 如何更改 PWA 中的 Android 导航栏颜色?
- flutter - 当我尝试执行颤振项目时,在“解决依赖关系”步骤中出现“运行 Gradle 时出错”
- javascript - 如何在 JavaScript 中禁用和启用按钮
- python - 在 Google Cloud 函数中包含 NLTK
- json - JSONField 显示模板中的特定字段
- linux - 是否有任何命令可以在 Linux 中基于多列进行模糊匹配