1

我必须将用户名拆分为名字和姓氏,但我不知道名称中可能包含多少元素。我有一些工作代码,但似乎可以优化。

有没有人有任何建议可以使它更优雅?

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;

}
4

2 回答 2

2

我认为第 7 行$names = explode(' ',$name);需要删除。

至于优化,代码非常简单,所以如果它正在做你需要的(即你的测试用例返回你满意的结果)那么我建议的唯一优化是

$lastname = implode(' ', $names); 

而不是你的while循环。由于您unset用于删除已处理的项目,$names因此将仅是剩余的项目(姓氏)。虽然这是微优化,但它会让你的代码更干净一些,并消除一些杂乱无章的东西。

于 2012-09-24T21:34:56.663 回答
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;
}

如果它是可识别的前缀,则忽略第一部分,并从最后一部分获取姓氏。

于 2012-09-24T21:38:57.787 回答