개발 중에는 종종 문자열 세트를 정렬해야합니다. 전통적인 분류 방법은 종종 사전 순서로 문자열을 분류하며 때로는 분류 결과가 "자연 분류"규칙을 준수하기를 원합니다. PHP는 자연 분류를 구현하는 데 도움이되는 매우 유용한 기능 strnatcmp ()를 제공합니다.
이름에서 알 수 있듯이 자연 분류는 인간에 대한 기존의 이해에 따라 데이터를 분류하는 것을 말합니다. 예를 들어, 파일 이름을 정렬 할 때 "File10"은 사전 순서에서 첫 번째가 아닌 "File2"가이어야합니다. 전통적인 사전 분류 규칙은 "1"이 "2"보다 작기 때문에 "file10"순위는 "File10"순위는 "2"보다 작고 자연 분류는 숫자 크기별로 정렬됩니다.
PHP의 strnatcmp () 함수는 두 줄을 비교하기위한 자연적인 분류 함수입니다. strcmp () 와 유사하지만 strnatcmp ()는 문자열의 숫자 부분을보다 지능적으로 처리하여 사람과 같은 분류 규칙을 가능하게합니다.
기능 프로토 타입 :
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> )
</span></span>$ str1 및 $ str2 :이 두 매개 변수는 비교해야 할 두 개의 문자열입니다.
반환 값 : $ str1이 $ str2 전에 순위가 매겨지면 음의 정수를 반환합니다. $ str1이 $ str2 와 같으면 0을 반환합니다. $ str1이 $ str2 이후에 순위가 매겨지면 양수 정수를 반환합니다.
기존 문자열 비교 함수와 달리 strnatcmp ()는 문자열의 숫자 부분을 구문 분석하고 실제 숫자 크기에 따라 비교합니다. 비교 결과가 결정될 때까지 문자열의 각 부분을 하나씩 비교합니다.
예를 들어, "file10" 과 "file2"를 비교할 때 strnatcmp ()는 먼저 문자 부분 "파일" 을 비교 한 다음 숫자 파트 10 과 2를 계속 비교합니다. 10 은 2 보다 크기 때문에 "File10"은 "File2" 뒤에 순위가 매겨집니다.
strnatcmp ()를 사용하여 파일 이름 세트를 자연스럽게 정렬 할 수 있습니다. 코드는 다음과 같습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 정렬 할 문자열 배열</span></span><span>
</span><span><span class="hljs-variable">$fileNames</span></span><span> = [</span><span><span class="hljs-string">'file2.txt'</span></span><span>, </span><span><span class="hljs-string">'file10.txt'</span></span><span>, </span><span><span class="hljs-string">'file1.txt'</span></span><span>, </span><span><span class="hljs-string">'file12.txt'</span></span><span>, </span><span><span class="hljs-string">'file11.txt'</span></span><span>];
</span><span><span class="hljs-comment">// 사용usort()결합strnatcmp()자연스러운 분류를하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$fileNames</span></span><span>, </span><span><span class="hljs-string">'strnatcmp'</span></span><span>);
</span><span><span class="hljs-comment">// 출력 정렬 결과</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fileNames</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . PHP_EOL;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>출력 결과 :
<span><span>file1.txt
file2.txt
file10.txt
file11.txt
file12.txt
</span></span>이 예에서는 먼저 파일 이름이 포함 된 배열을 작성한 다음 usort () 함수를 사용하여 배열을 strnatcmp () 로 자연스럽게 정렬합니다. 정렬 된 배열은 우리가 기대하는 순서와 일치하고 숫자 부품의 크기가 정렬됩니다.
strnatcmp () 외에도 php는 strnatcasecmp ()를 제공하는데, 이는 strnatcmp () 함수와 유사하지만 strnatcasecmp ()는 비교할 때의 경우 차이를 무시합니다.
예:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 忽略大小写자연스러운 분류를하십시오</span></span><span>
</span><span><span class="hljs-variable">$fileNames</span></span><span> = [</span><span><span class="hljs-string">'File2.txt'</span></span><span>, </span><span><span class="hljs-string">'file10.txt'</span></span><span>, </span><span><span class="hljs-string">'File1.txt'</span></span><span>, </span><span><span class="hljs-string">'file12.txt'</span></span><span>, </span><span><span class="hljs-string">'file11.txt'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$fileNames</span></span><span>, </span><span><span class="hljs-string">'strnatcasecmp'</span></span><span>);
</span><span><span class="hljs-comment">// 출력 정렬 결과</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fileNames</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . PHP_EOL;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>출력 결과 :
<span><span>File1.txt
File2.txt
file10.txt
file11.txt
file12.txt
</span></span>strnatcmp () 및 strnatcasecmp ()를 사용하면 숫자를 자연스럽게 포함하는 문자열을 쉽게 정렬하여 분류 결과가 인간 직관과 일치하도록합니다. 이러한 기능은 파일 이름 분류, 버전 번호 비교 등과 같은 시나리오에 매우 적합합니다.
이 기사가 자연 분류 기능과 PHP의 응용 프로그램을 더 잘 이해하는 데 도움이되기를 바랍니다.