현재 위치: > 최신 기사 목록> PHP USORT 기능을 사용할 때 발생할 수있는 오류 및 솔루션 정렬

PHP USORT 기능을 사용할 때 발생할 수있는 오류 및 솔루션 정렬

gitbox 2025-06-23

PHP에서 usort () 함수는 배열 정렬을 사용자 정의하는 데 사용됩니다. 매우 강력하고 사용자 정의 비교 기능을 기반으로 배열 요소를 정렬 할 수 있습니다. 그러나 실제로 사용하면 비교 함수 또는 정렬 된 배열 구조의 잘못된 반환 값과 관련된 일부 정렬 오류가 발생할 수 있습니다. 이 기사는 몇 가지 일반적인 오류를 분석하고 해당 솔루션을 제공합니다.

1. 비교 함수의 반환 값이 올바르지 않습니다.

USORT () 함수의 핵심은 사용자 정의 비교 함수입니다. 이 비교 함수는 배열에서 두 개의 요소를 나타내는 두 개의 매개 변수를 허용합니다. 비교 함수는이 두 요소의 순서를 나타내는 정수를 반환해야합니다.

  • 반환 값은 0보다 작습니다. 첫 번째 요소가 두 번째 요소보다 앞서 있어야합니다.

  • 반환 값은 0과 같습니다. 두 요소가 동일하고 상대 순서가 변경되지 않음을 의미합니다.

  • 반환 값 0보다 큰 반환 값 : 첫 번째 요소가 두 번째 요소를 따라야 함을 의미합니다.

비교 함수 가이 규칙을 따르지 않으면 usort ()에 정렬 오류가 발생합니다. 일반적인 오류는 비교 함수의 반환 값 유형이 잘못되었거나 반환 값 범위가 요구 사항을 충족하지 않는다는 것입니다.

Error example:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</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">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span> &lt; </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-number">1</span></span><span>;
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span> &gt; </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-number">1</span></span><span>;
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">'equal'</span></span><span>;  </span><span><span class="hljs-comment">// 잘못된 반환 값</span></span><span>
});
</span></span>

위의 예에서 '동일' 은 문자열이며, usort ()는 정수를 반환 할 것으로 예상합니다. 이로 인해 분류 동작이 기대치와 일치하지 않습니다.

해결책:

비교 함수가 항상 정수 값을 반환해야합니다. 이를 수행하는 올바른 방법은 -1 , 0 또는 1을 반환하는 것입니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</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">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span> &lt; </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-number">1</span></span><span>;
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span> &gt; </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-number">1</span></span><span>;
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">0</span></span><span>;  </span><span><span class="hljs-comment">// 올바른 반환 값</span></span><span>
});
</span></span>

2. 배열 요소 유형은 일치하지 않습니다

USORT () 함수는 다양한 유형의 어레이 요소에 적합하지만 배열의 요소 유형이 일치하지 않으면 정렬 결과를 예측할 수 없을 수 있습니다. 예를 들어, 숫자와 문자열 배열은 정렬시 잘못된 순서로 이어질 수 있습니다.

Error example:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'1'</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</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-variable">$a</span></span><span> - </span><span><span class="hljs-variable">$b</span></span><span>;
});
</span></span>

USORT ()는 배열 요소의 유형을 변환하려고 시도하지만 문자열과 숫자의 혼합이 비교 작업에 관여하는 경우 예상치 못한 결과로 이어질 수 있습니다.

해결책:

비교 함수에서, 어레이 요소의 유형은 비교 로직의 일관성을 보장하기 위해 명시 적으로 변환됩니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'1'</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</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-keyword">int</span></span><span>)</span><span><span class="hljs-variable">$a</span></span><span> - (</span><span><span class="hljs-keyword">int</span></span><span>)</span><span><span class="hljs-variable">$b</span></span><span>;  </span><span><span class="hljs-comment">// 정수에 캐스트</span></span><span>
});
</span></span>

3. 다차원 배열을 정렬 할 때 오류

USORT ()를 사용하여 다차원 배열을 정렬하면 배열 요소의 중첩 구조로 인해 분류가 올바르게 진행되지 않는 문제가 발생할 수 있습니다. 특히 하위 요소로 정렬 해야하는 경우 비교 함수가 하위 요소에 올바르게 액세스하지 않으면 정렬이 실패 할 수 있습니다.

Error example:

 <span><span><span class="hljs-variable">$array</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Tom'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Alice'</span></span><span>]
];
</span><span><span class="hljs-title function_ invoke__">usort</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-variable">$a</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] - </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>];
});
</span></span>

이 예에서는 코드가 잘 보이지만 'ID' 키와 같은 배열의 구조가 존재하지 않거나 그 값이 비어 있으면 정렬 오류로 이어질 수 있습니다.

해결책:

비교 함수는 키가 존재하는지 확인하거나 오류를 방지하기 위해 기본값을 제공하여 가능한 모든 상황을 처리해야합니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Tom'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Jerry'</span></span><span>],
    [</span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Alice'</span></span><span>]
];
</span><span><span class="hljs-title function_ invoke__">usort</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-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>]) ? </span><span><span class="hljs-variable">$a</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] : </span><span><span class="hljs-number">0</span></span><span>) - (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>]) ? </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] : </span><span><span class="hljs-number">0</span></span><span>);
});
</span></span>

4. 정렬 후 배열 인덱스가 손실됩니다

USORT () 가 배열을 정렬하면 배열이 다시 표시되므로 원래 배열 인덱스가 폐기됩니다. 원래 배열의 키를 유지 해야하는 경우 usort ()가 적합하지 않을 수 있습니다.

Error example:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span> =&gt; </span><span><span class="hljs-string">'apple'</span></span><span>, </span><span><span class="hljs-number">1</span></span><span> =&gt; </span><span><span class="hljs-string">'banana'</span></span><span>, </span><span><span class="hljs-number">2</span></span><span> =&gt; </span><span><span class="hljs-string">'cherry'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</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__">strcmp</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>

위의 코드는 원래 인덱스없이 배열을 출력합니다.

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; apple
    [</span><span><span class="hljs-number">1</span></span><span>] =&gt; banana
    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; cherry
)
</span></span>

해결책:

원래 배열의 키를 유지 해야하는 경우 usort () 와 다른 uasort () 를 사용하여 원래 배열의 키를 유지할 수 있습니다.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span> =&gt; </span><span><span class="hljs-string">'apple'</span></span><span>, </span><span><span class="hljs-number">1</span></span><span> =&gt; </span><span><span class="hljs-string">'banana'</span></span><span>, </span><span><span class="hljs-number">2</span></span><span> =&gt; </span><span><span class="hljs-string">'cherry'</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__">strcmp</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>

이것은 원래 키 순서를 보존합니다.

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">3</span></span><span>] =&gt; apple
    [</span><span><span class="hljs-number">1</span></span><span>] =&gt; banana
    [</span><span><span class="hljs-number">2</span></span><span>] =&gt; cherry
)
</span></span>

5. 부동 소수점을 분류 할 때 정밀 문제

부동 소수점이 포함 된 배열을 정렬 할 때는 부동 소수점의 정확도 제한으로 인해 정렬 오류가 발생할 수 있습니다. 특히 숫자의 정확도가 매우 높으면 비교는 예상대로 아닐 수 있습니다.

Error example:

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1.0000001</span></span><span>, </span><span><span class="hljs-number">1.0000002</span></span><span>, </span><span><span class="hljs-number">1.0000003</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</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-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>

플로팅 수의 비교는 정확도에 의해 영향을받을 수있어 불안정한 정렬 결과를 초래할 수 있습니다.

해결책:

Round () 함수를 사용하여 부동 소수점의 숫자 수를 제한하여 떠 다니는 정밀 문제로 인한 오류를 피하십시오.

 <span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">1.0000001</span></span><span>, </span><span><span class="hljs-number">1.0000002</span></span><span>, </span><span><span class="hljs-number">1.0000003</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</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__">round</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-number">7</span></span><span>) - </span><span><span class="hljs-title function_ invoke__">round</span></span><span>(</span><span><span class="hljs-variable">$b</span></span><span>, </span><span><span class="hljs-number">7</span></span><span>);  </span><span><span class="hljs-comment">// 정확도를 제한합니다</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>