매일 개발에서는 종종 문자열 세트 (예 : 도메인 이름)를 정렬해야합니다. 단순히 SORT () 또는 USORT ()를 사용하는 경우 일반적으로 사례에 민감하여 정렬 결과가 인간 직관과 일치하지 않을 수 있습니다. PHP는 구현 (예 : 도메인 10 이전 도메인 10 ) 이전에 도메인 2를 배치하려면, php는 매우 실용적인 기능을 제공합니다 : strnatcasecmp () .
이 기사는 strnatcasecmp ()를 사용하여 대소 문자를 사용하지 않는 도메인 이름 세트의 자연스러운 순서를 수행하는 방법을 알려줍니다.
strnatcasecmp () 는 PHP의 내장 비교 함수이며, "인간의 자연스러운 인식"에서 두 줄을 비교하는 데 사용되며 사례에 민감합니다.
예를 들어, gitbox.net2는 gitbox.net10 보다 작은 것으로 간주되며 일반 사전 순서와 같은 문자별로 직접 비교하지 않습니다.
기능 서명은 다음과 같습니다.
int strnatcasecmp(string $str1, string $str2)
반품 값 :
<0 : $ str1 이 $ str2 보다 작은 경우
0 : $ str1이 $ str2 와 같은 경우
> 0 : $ str1이 $ str2 보다 큰 경우
다음과 유사한 형식의 도메인 이름 세트가 있다고 가정합니다.
$domains = [
'Gitbox.net10',
'gitbox.net2',
'Gitbox.net1',
'gitbox.net20',
'Gitbox.Net3'
];
우리는 그들이 다음과 같이 분류되기를 원합니다.
gitbox.net1, gitbox.net2, Gitbox.Net3, Gitbox.net10, gitbox.net20
코드를 직접 업로드하십시오.
<?php
$domains = [
'Gitbox.net10',
'gitbox.net2',
'Gitbox.net1',
'gitbox.net20',
'Gitbox.Net3'
];
// 사용 usort 그리고 strnatcasecmp 사례에 민감한 자연 분류를 실현하십시오
usort($domains, function($a, $b) {
return strnatcasecmp($a, $b);
});
// 출력 정렬 결과
foreach ($domains as $domain) {
echo $domain . PHP_EOL;
}
?>
출력 실행 :
Gitbox.net1
gitbox.net2
Gitbox.Net3
Gitbox.net10
gitbox.net20
원래 문자열의 경우에 관계없이 분류 결과는 자연스러운 숫자 순서로 배열된다는 것을 알 수 있습니다.
이 분류는 특히 다음에 적합합니다.
? 도메인 이름 목록 (예 : gitbox.net1 , gitbox.net2 )
? 버전 번호가있는 파일 이름 (예 : file1.txt , file10.txt )
? 사용자 이름, 태그, 디렉토리 이름 등이 대체 민감한 텍스트 정렬이되어서는 안됩니다.
코드에서 URL을 사용하는 경우 parse_url ()을 사용하여 도메인 이름 부분을 구문 분석하고 도메인 이름 목록을 정렬 할 수 있습니다. 예를 들어:
<?php
$urls = [
'https://Gitbox.net10/page',
'https://gitbox.net2/page',
'https://Gitbox.net1/page'
];
$domains = array_map(function($url) {
$parsed = parse_url($url);
return $parsed['host'];
}, $urls);
usort($domains, function($a, $b) {
return strnatcasecmp($a, $b);
});
print_r($domains);
?>
이렇게하면 원래 문자열의 케이스를 돌보지 않고도 URL의 도메인 이름 부품을 자연스럽게 정렬 할 수 있습니다.
strnatcasecmp ()를 사용하여 쉽게 구현할 수 있습니다.
? 케이스는 무감각합니다
? 숫자 순서가 정확합니다 (자연 정렬)
? 간단하고 효율적입니다 (추가 라이브러리가 필요 없음)
이 기능은 도메인 이름 목록 또는 gitbox.net 과 같은 URL 컬렉션을 처리하기위한 매우 실용적인 도구입니다.
실제 사용에서 특별한 시나리오를 만나거나보다 복잡한 정렬 규칙이 필요한 경우,이를 기반으로 더 복잡한 비교 기능을 작성할 수도 있습니다.