2010-06-06 3 views
1

가 나는 등의 데이터가 있습니다텍스트에 의한 주문 후 수

오디오 1 테스트
파일 10
오디오 2
오디오 3
파일 (11) 오디오 1
오디오 (13)
오디오 22
파일 20 테스트
테스트 파일 22
오디오 1012 3, 파일 1
파일 2

I가 텍스트 의해 일차 필요한 (즉, 오디오, 파일, 테스트)를 선택한 다음 번호 (1,2,3,4,5,6,7,8,9,1011121314151617181920

오디오 1
오디오 1 테스트
오디오 (10)
오디오 (13)
오디오 2
오디오 :, 21, 22 등)

문제는 그것을 분류하는 것은 이런 식으로 뭔가를 반환한다는 것입니다 22
오디오 3
파일 1
,451,515,파일 10
파일 (11)
파일 2
파일 (20) 테스트
테스트 파일 (22)

내가 원하는 결과가 있지만 :

오디오 1
오디오 1 테스트
오디오 2
오디오 3
오디오 1오디오 13
22
오디오 파일 1
파일 2
파일 10
파일 11
파일 (20) 테스트
테스트 파일 22

그들은 단지 숫자 인 경우 (즉, 오디오, 파일, 테스트없이) 숫자로만 정렬 할 수 있습니다.

그러나 여기서는 먼저 텍스트로 정렬 한 다음 번호로 정렬 할 수 있습니다.

답변

2

나는 당신이 찾고있는 것이 natsort라고 생각합니다.

부울 natsort (배열 & $ 배열)

이 기능은 인간이 키/값 연결을 유지하는 것 중에 방식으로 영숫자 문자열을 정렬하는 알고리즘을 구현합니다. 이것은 "자연스러운 주문"이라고합니다 ...

+0

이 정확히 내가 필요로하는 것입니다. 고마워. – Chaim

4

가장 좋은 해결책은 텍스트로 정렬 한 다음 숫자로 정렬하는 안정적인 정렬 알고리즘을 사용하는 것이지만 usort과 자신의 비교 알고리즘을 사용하면이 상황에서 동일한 결과를 얻을 수 있습니다.

2 분 안에 내가 해준 해결책이 있습니다 (추한 코드에 사과드립니다).

<?php 

$str = 'Audio 1 
File 10 
Audio 2 
Audio 3 
File 11 
Audio 13 
Audio 22 
File 20 
Test 22 
Audio 10 
File 1 
File 2'; 

$arr = explode("\n", $str); 

foreach($arr as $k => $v) { 
    $arr[$k] = explode(" ", $v); 
} 

function mycmp($value1, $value2) { 
    $txt1 = $value1[0]; 
    $txt2 = $value2[0]; 
    $num1 = intval($value1[1]); 
    $num2 = intval($value2[1]); 

    if($txt1 === $txt2) { 
     return $num1 > $num2; 
    } 
    else { 
     return strcmp($txt1, $txt2) > 0; 
    } 
}; 


usort($arr, "mycmp"); 

foreach($arr as $v) { 
    echo $v[0]. "\t" . $v[1]. "\n"; 
} 
+0

+1 2 분간 작업이 활발합니다! – cjh

+0

고마워요, 이거 좋네. 어떻게 입력 테스트 파일 1 테스트 파일이 또는 같은 같은 경우에 대해 : 파일 1 개 테스트 파일이 테스트 – Chaim

관련 문제