현재 위치: > 최신 기사 목록> 정렬 할 때 Natsort 기능이 배열의 원래 키 값을 변경하는 것을 방지하는 방법은 무엇입니까?

정렬 할 때 Natsort 기능이 배열의 원래 키 값을 변경하는 것을 방지하는 방법은 무엇입니까?

gitbox 2025-08-30

PHP에서 Natsort 함수는 일반적으로 사용되는 분류 방법으로 요소를 "자연 순서"로 분류합니다. 이러한 분류 방법은 ASCII 코드의 전통적인 순서가 아닌 "10"이 "2"보다 먼저 순위가 매겨 질 수 있습니다. 그러나 Natsort 로 정렬 할 때 문제가 발생할 수 있습니다. 배열의 키 값을 재설정하여 원래 키 값이 손실됩니다. 이로 인해 후속 작업의 원래 키 값을 기반으로 데이터에 액세스하기가 어려울 수 있습니다.

이 기사는 Natsort가 배열의 원래 키 값을 변경하지 않는 방법에 대해 논의하고 몇 가지 관련 팁과 대안을 소개합니다.

Natsort 와 그 영향

Natsort 함수의 기능은 "자연 순서"에 따라 배열을 정렬하는 것입니다. 소위 자연 순서 정렬은 사전 순서로 정렬하는 대신 정렬 할 때 크기별로 숫자를 분류하는 것을 말합니다. 예를 들어:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'a20'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

위의 코드를 실행 한 후 출력 결과는 다음과 같습니다.

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; a1
    [</span><span><span class="hljs-number">1</span></span><span>] =&gt; a2
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; a10
    [</span><span><span class="hljs-number">3</span></span><span>] =&gt; a20
)
</span></span>

보시다시피, Natsort는 배열을 숫자 크기로 정렬하지만 배열의 키 값을 재설정하여 요소와 관련된 원래 키가 더 이상 보존되지 않도록합니다.

키 가치 손실을 방지하는 방법

Natsort를 사용할 때 원래 키 값을 유지하려면 정렬하기 전에 원래 배열의 키 값을 저장 한 다음 정렬 된 배열을 재 구축 할 수 있습니다. 이를 통해 분류 프로세스가 원래 키 값에 영향을 미치지 않도록합니다.

방법 1 : Array_Values ​​및 Natsort를 사용하십시오

배열 값을 추출하여 정렬 할 수 있으며 키 값은 변경되지 않습니다. 이것은 array_values ​​함수를 통해 달성됩니다. 구체적인 방법은 원래 키 값을 먼저 유지 한 다음 정렬하는 것입니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-string">'a20'</span></span><span>];

</span><span><span class="hljs-comment">// 원래 키 값을 저장하십시오</span></span><span>
</span><span><span class="hljs-variable">$original_keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-comment">// 자연스럽게 값을 정렬합니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-comment">// 원래 키 값을 복원하십시오</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(</span><span><span class="hljs-variable">$original_keys</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

출력 결과 :

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [a] =&gt; a1
    [b] =&gt; a2
    [c] =&gt; a10
    [d] =&gt; a20
)
</span></span>

이 접근법에서 원래 키 값은 먼저 Array_keys 에 의해 얻어지고 배열은 Natsort를 사용하여 정렬됩니다. 정렬이 완료되면 array_combine을 사용하여 키 값과 정렬 된 값 사이의 해당 사항을 복원하십시오.

방법 2 : UASORT를 사용하여 정렬을 사용자 정의하십시오

또 다른 방법은 사용자 지정 정렬에 UASORT 기능을 사용하는 것입니다. Natsort 와 마찬가지로 Uasort는 배열을 정렬 할 수 있지만 키 값을 변경하지는 않습니다. 사용자 정의 정렬 기능을 구현하면 원래 키 값을 유지하면서 분류 방법을 제어 할 수 있습니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> =&gt; </span><span><span class="hljs-string">'a10'</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> =&gt; </span><span><span class="hljs-string">'a2'</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> =&gt; </span><span><span class="hljs-string">'a1'</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> =&gt; </span><span><span class="hljs-string">'a20'</span></span><span>];

</span><span><span class="hljs-title function_ invoke__">uasort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>

UASORT는 콜백 함수를 정렬하는데, 이는 내부적으로 StrNATCMP 함수를 사용하여 배열의 키 값을 변경하지 않고 자연 순서의 정렬 방법을 시뮬레이션합니다.

출력 결과 :

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [c] =&gt; a1
    [b] =&gt; a2
    [a] =&gt; a10
    [d] =&gt; a20
)
</span></span>

요약

Natsort 는 강력한 분류 기능이지만 배열의 핵심 값을 재설정합니다. 정렬 프로세스 중에 핵심 값을 보존 해야하는 경우 두 가지 방법 중 하나를 사용할 수 있습니다.

  1. 원래 키 값을 먼저 저장 한 다음 정렬 후 array_combine을 통해 키 값을 복원하십시오.

  2. 키 가치 손실을 피하기 위해 사용자 정의에 UASORT 기능을 사용하십시오.

이 두 가지 방법을 사용하면 분류 프로세스 중에 데이터 손실을 피하면서 배열이 자연스럽게 정렬 된 후에도 원래 키 값을 계속 변경할 수 있는지 확인할 수 있습니다.