使用数组中的值更改字符串的一部分,但仅当可以找到整个值时

Change parts of a string with values from an array, but only when the whole value can be found

我必须将多个国家/地区名称的字符串替换为另一种语言的翻译。所以我创建了一个国家数组,其中键是英语中的国家,值是目标语言中的国家...

所以,让我先把我使用的数组的相关摘录放上来:

$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 Κορέα

我认为这里发生的事情很明显...在密钥 West Germany 之前找到密钥 Germany,因此 str_replace 将 Germany 部分替换为它的翻译名称,因此 West 保持未翻译状态。 .. 韩国也是如此,(按字母顺序)恰好在韩国之前...

将西德和韩国移到德国和韩国之上解决了这个问题,但我想这不是解决这个问题的正确方法,因为它会发生在东德,而且一般来说,任何其他有两个字等...

您认为正确的处理方式是什么? 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);});