[英]phonetic Case-insensitive search in array
我有这样的数组
array
0 => string 'Schmitt' (length=6)
1 => string 'Maier' (length=1)
2 => string 'Müller' (length=7)
3 => string 'müller' (length=7)
4 => string 'mueller' (length=7)
5 => string 'Toll' (length=4)
我想得到这样的东西
array
0 => string 'Schmitt' (length=6)
1 => string 'Maier' (length=1)
2 => string 'Müller' (length=7)
3 => string 'Toll' (length=4)
我想检查所有的变音符号,例如“ä”,“ö”,“ü”,并且应该区分大小写。 第一个字母将是大写的,但是我自己会得到。 只需要使用拼音的东西帮助,因为我不想做一个巨大的if...else
东西。
您可以尝试如下操作:
$replacements = ['ü' => ['ue']];
$names = ['Schmitt', 'Maier', 'Müller', 'müller', 'mueller', 'Toll'];
$names = array_map('strtolower', $names);
$names = array_reduce($names, function ($carry, $name) use ($replacements) {
foreach ($replacements as $replaceWith => $replaceWhat) {
$name = str_replace($replaceWhat, $replaceWith, $name);
}
if (!in_array($name, $carry)) {
$carry[] = $name;
}
return $carry;
}, []);
$names = array_map('ucfirst', $names);
var_dump($names);
结果将是:
array(4) {
[0]=>
string(7) "Schmitt"
[1]=>
string(5) "Maier"
[2]=>
string(7) "Müller"
[3]=>
string(4) "Toll"
}
您可以将“语音版本”作为键存储在结果数组中(通过这种方式,无需使用in_array
即可知道是否已经添加了单词,您只需检查键是否存在):
$names = ['Schmitt', 'Maier', 'Müller', 'müller', 'mueller', 'Toll'];
$rules = ['ü' => 'ue', 'ä' => 'ae', 'ö' => 'oe', 'ß' => 'ss' ]; // uzw
$result = [];
foreach ($names as $name) {
$phonetic = strtr(mb_strtolower($name), $rules);
if ( !isset($result[$phonetic]) )
$result[$phonetic] = $name; // put mb_ucfirst here
}
$result = array_values($result);
print_r($result);
由于要处理多字节字符,因此需要使用mb_strtolower
以避免错误。 出于同样的原因,如果需要将第一个字符大写,则应使用php手册中 plemieux发布的函数:
function mb_ucfirst($str) {
$fc = mb_strtoupper(mb_substr($str, 0, 1));
return $fc . mb_substr($str, 1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.