使用数组中的值更改字符串的一部分,但仅当可以找到整个值时
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);});
我必须将多个国家/地区名称的字符串替换为另一种语言的翻译。所以我创建了一个国家数组,其中键是英语中的国家,值是目标语言中的国家...
所以,让我先把我使用的数组的相关摘录放上来:
$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);});