我必须将用户名拆分为名字和姓氏,但我不知道名称中可能包含多少元素。 我有一些工作代码,但似乎可以优化。
有没有人有任何建议让这更优雅?
function createMoodleUserNames($fullname){
$names = explode(' ',$fullname);
$prefixes = array('Dr.','Ms.','Mr.','Mrs.');
$names = explode(' ',$name);
$i = 0;
if(in_array($names[0],$prefixes)){
$firstname = $names[0].' '.$names[1];
unset($names[0]);
unset($names[1]);
}else{
$firstname = $names[0];
unset($names[0]);
}
$lastname = '';
while($i < count($names)){
$lastname .= ' '.$names[$i];
$i++;
}
$output = array();
$output[0] = $firstname;
$output[1] = $lastname;
return $output;
}
答案 0 :(得分:2)
我认为需要删除第7行$names = explode(' ',$name);
。
就优化而言,代码非常简单,所以如果它正在满足您的需求(即您的测试用例返回您满意的结果),那么我建议的唯一优化是
$lastname = implode(' ', $names);
而不是你的while循环。由于您使用unset
删除已处理的项目,因此$names
仅为剩余项目(姓氏)。虽然这是微优化,但它会使你的代码更清洁,并删除一些瑕疵。
答案 1 :(得分:2)
我不确定您解析的数据有多复杂,但这种直截了当的解决方案可能适合您:
<?php
function parseName($fullName) {
$parts = preg_split('~\s+~', $fullName);
$result = array();
if (!preg_match('~(dr|mr|ms|mrs)\.?~', strToLower($parts[0]))) {
$result[] = $parts[0];
} else {
$result[] = $parts[1];
}
$result[] = end($parts);
return $result;
}
如果第一部分是公认的前缀并且从最后一部分取姓氏,则忽略第一部分。