首页 > 解决方案 > 使用数组中的值更改字符串的一部分,但仅当可以找到整个值时

问题描述

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

所以,让我先放一个我使用的数组的相关摘录:

$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

标签: phpstr-replace

解决方案


这有点作弊,但是如果您要使用 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);});

推荐阅读