2012-09-24 4 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은 나머지 항목 (성)에만 적용됩니다. 이것이 마이크로 최적화 임에도 불구하고 코드를 조금 더 깨끗하게 만들고 일부 거칠기를 제거합니다.

관련 문제