2012-09-24 22 views
1

我必須將用戶名分成名字和姓氏,但我不知道名稱中可能有多少元素。 我有一些工作代碼,但它似乎可以優化。分裂一個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; 

} 
+1

就在while循環之前,添加$ names = array_values($ names);.當您取消設置數組索引時,索引本身不會重置。這將確保他們在循環之前。 – trickyzter

+0

謝謝 - 「$ names = array_values($ names);」我確實發現了一個難以實現的方法:) –

+0

難道我們都沒有; ;) – trickyzter

回答

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

忽略第一部分,如果它是一個公認的前綴,從最後部分以家族的名字。

+1

感謝球員,希望我能標記兩個答案是正確的,都有我將使用的元素......標記Mikulas正確,因爲你有更少的聲譽;) –

2

我覺得第7行,$names = explode(' ',$name);需要刪除。

至於優化,代碼是非常簡單的,所以如果是做你需要什麼(即你的測試用例返回結果你滿意),那麼我會建議只優化

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

而不是你的while循環。由於您正在使用unset刪除已處理的物品,因此$names將僅爲剩餘物品(姓氏)。雖然這是微型優化,但它會讓你的代碼更清潔並刪除一些垃圾。

相關問題