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

$names = explode(' ',$name);行 7を削除する必要がある と思います。

最適化に関する限り、コードは非常に単純なので、必要なことを実行している場合 (つまり、テスト ケースが満足のいく結果を返す場合)、私が提案する唯一の最適化は次のとおりです。

$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 に答える