현재 위치: > 최신 기사 목록> strnatcasecmp를 통해 접두사로 파일 이름을 정렬하는 방법은 무엇입니까?

strnatcasecmp를 통해 접두사로 파일 이름을 정렬하는 방법은 무엇입니까?

gitbox 2025-05-27

파일 관리, 리소스로드 또는 버전 제어 시나리오에서는 종종 접두사 파일 이름 세트를 정렬하는 문제가 발생합니다. 예를 들어 파일 목록은 다음과 같습니다.

 file1.txt, file10.txt, file2.txt, file20.txt

일반 문자열 비교 ( strcmp 또는 USORT 기본 규칙)와 직접 정렬하면 결과는 다음과 같습니다.

 file1.txt, file10.txt, file2.txt, file20.txt

이것은 분명히 우리가 기대하는 "자연 순서"정렬이 아닙니다. 직관적으로 File2.txt는 file10.txt 보다 앞서 있어야합니다.

이 문제를 해결하기 위해 PHP는 매우 유용한 기능을 제공합니다 : Strnatcasecmp . 사례에 민감한 자연 질서 비교를 만드는 데 사용될 수 있습니다.

strnatcasecmp 란 무엇입니까?

strnatcasecmp 는 PHP의 내장 문자열 비교 함수로, "자연 순서"에서 케이스에 민감한 비교를하는 데 사용됩니다.

소위 "자연 순서"는 숫자 부분이 단순히 문자가 아닌 숫자 값으로 비교됨을 의미합니다. 예를 들어, 문자 1 의 ASCII가 2 보다 작기 때문에 10> 2 이기 때문에 10은 2 뒤에 있습니다.

예 : 접두사로 파일 이름을 정렬하십시오

다음과 같은 파일 목록이 있다고 가정합니다.

 $files = [
    'file10.txt',
    'file2.txt',
    'file1.txt',
    'file20.txt',
    'file11.txt'
];

우리는 그것들을 자연 순서로 분류하고 싶습니다. 그리고 우리는 이것을 할 수 있습니다.

 usort($files, function($a, $b) {
    return strnatcasecmp($a, $b);
});

print_r($files);

실행 결과 :

 Array
(
    [0] => file1.txt
    [1] => file2.txt
    [2] => file10.txt
    [3] => file11.txt
    [4] => file20.txt
)

보시다시피, file10.txt 는 정상 문자열 비교와 같이 순서대로 파일 2.txt 뒤에 순위가 매겨집니다.

보다 복잡한 예 : 경로 또는 전체 URL

파일 이름이 완전한 URL 인 경우 다음과 같습니다.

 $files = [
    'https://gitbox.net/file10.txt',
    'https://gitbox.net/file2.txt',
    'https://gitbox.net/file1.txt',
    'https://gitbox.net/file20.txt',
    'https://gitbox.net/file11.txt'
];

동일한 USORT 정렬 방법을 직접 사용할 수 있습니다.

 usort($files, function($a, $b) {
    return strnatcasecmp($a, $b);
});

print_r($files);

참고 : strnatcasecmp는 프로토콜 및 도메인 이름을 포함한 전체 문자열을 비교합니다. 파일 이름 부분 만 정렬하려면 파일 이름을 먼저 추출하려면 parse_urlbasename을 사용해야합니다.

파일 이름으로 만 정렬 (URL 접두사 무시)

Filename Part ( https://gitbox.net/ 무시)별로 정렬하려면 다음을 수행 할 수 있습니다.

 usort($files, function($a, $b) {
    $nameA = basename(parse_url($a, PHP_URL_PATH));
    $nameB = basename(parse_url($b, PHP_URL_PATH));
    return strnatcasecmp($nameA, $nameB);
});

print_r($files);

이를 통해 URL의 접두사 부분이 다르더라도 정렬은 파일 이름을 기반으로합니다.