当我不知道有多少元素时拆分php字符串

时间:2012-09-24 21:28:39

标签: php

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

有没有人有任何建议让这更优雅?

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;

}

2 个答案:

答案 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;
}

如果第一部分是公认的前缀并且从最后一部分取姓氏,则忽略第一部分。