2011-08-29 2 views
0

간단한 질문으로 앨범 제목의 시작 부분에 'a'및 'the'와 같은 단어를 제외하면 제목 배열을 사전 순으로 정렬하는 것이 가장 좋은 방법은 무엇입니까? . 나는 작동하는 기능을 가지고 있지만 일종의 끈적한 것 같아요, 내가 생각하지 않는 이것보다 더 좋은 방법이 있는지 궁금 해서요.제목의 시작 부분에 특정 단어를 제외시키기 위해 PHP의 소트 (utort) 사용하기

function cmp($a, $b) { 
    $excludes = array('a', 'the'); // Add excluded words here 
    foreach ($excludes as $word): 
     if (strtolower(substr($a['title'], 0, strlen($word) + 1)) == "{$word} ") $a['title'] = substr($a['title'], strlen($word) + 1); 
     if (strtolower(substr($b['title'], 0, strlen($word) + 1)) == "{$word} ") $b['title'] = substr($b['title'], strlen($word) + 1); 
    endforeach; 
    return strcasecmp($a['title'], $b['title']); 
} 

앞에서 설명한대로이 방법은 완벽하게 작동하지만 매우 좋은 방법은 아닙니다. 어떤 아이디어?

+0

는'메모리를 절약하고 성능을 향상 정적 $의 excludes'을 정의 찾을 수) – knittl

+0

그것은 수행해야 하는가에 usort 사용하고 계십니까? – GolezTrol

답변

2

당신은 당신의 코드를 약간 단순화하기 위해 preg_replace을 사용할 수 직전 비교 정규식을 사용하여

function cmp($a, $b) { 
    static $excludes = '/^(an?|the)\s+/i'; // Add excluded words here 
    return strcasecmp(
     preg_replace($excludes, '', $a['title']), 
     preg_replace($excludes, '', $b['title']) 
    ); 
} 
+0

은 'a'또는 'the'(예 : 'animals'또는 'there')로 시작하는 단어와 일치하므로 정규식에 단어 다음에 공백을 포함 할 수 있습니다. – helloandre

+0

감사, 좋은 지적! – knittl

+0

'\ b'를 단어 뒤의 문자로 사용할 때, 그 단어로 시작하는 제목을 배열의 시작 부분에 넣겠습니다. 그러나'\ s'를 문자로 사용하면 올바르게 정렬됩니다 그 말을 무시하고. – animuson

0

또 다른 방법은 if ​​/ elseif 블록에 루프를 푸는 것입니다. (빠른 IMHO처럼 보일 것입니다)

어떤 방법을 생각해 내는지 테스트 해보고 (10,000 장의 앨범 타이틀에서 10 번 실행) 어느 것이 가장 빠른 지 확인하십시오. 그런 다음 사용하십시오!

0

작동합니다 :

// Adjust song title deleting "the" or "a" and trimming left spaces 
function adjust($title) { 
    return preg_replace("/^(the|a) */i", ""); 
} 
function cmp($a, $b) { 
    return strcasecmp(adjust($a['title']), adjust($b['title'])); 
} 

당신이 문자열에 다른 조정을 수행 할 수있는이 방법을 전에 비교 .
여기 preg_replace doc을 발견하고 여기에 당신은 regex infos

관련 문제