PHP에서 배열 정렬은 데이터 처리에서 일반적인 작업입니다. 특히 다차원 분류가 필요한 다차원 배열 또는 시나리오에 직면 할 때 적절한 정렬 기능을 선택하는 것이 특히 중요합니다. arsort () 및 ksort () 는 종종 조합으로 사용되는 두 가지 함수입니다. 그들의 조합을 통해 배열의 값과 키는 순서대로 관리 될 수 있습니다. 이 기사에서는이 두 기능이 어떻게 조합하여 어떻게 조합하여 조합하여 사용되는지 자세히 설명합니다.
arsort () : 어레이를 하강 순서로 정렬하고 키 이름을 유지하고 "값"별로 정렬하십시오.
KSORT () : 키 값을 유지하면서 배열을 "키"로 오름차순으로 정렬하십시오.
이 두 기능은 본질적으로 "값"과 "키"를 각각 분류하는 것이지만 일부 시나리오에서는보다 유연한 다중 조건 분류 로직을 달성하기 위해 함께 사용될 수 있습니다.
여러 사용자의 점수 레코드를 나타내는 배열이 있다고 가정합니다.
<span><span><span class="hljs-variable">$users</span></span><span> = [
</span><span><span class="hljs-string">'user3'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">85</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">120</span></span><span>],
</span><span><span class="hljs-string">'user1'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">92</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">110</span></span><span>],
</span><span><span class="hljs-string">'user2'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">85</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">100</span></span><span>],
</span><span><span class="hljs-string">'user4'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">92</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">130</span></span><span>],
];
</span></span>현재 요구 사항은 다음과 같습니다.
첫 번째 정렬 별 점수 (점수);
점수가 동일하면 완료 시간 (시간)별로 오름차순으로 정렬하십시오.
점수와 시간이 동일하면 사용자 이름 (키 이름)별로 오름차순 순서로 정렬하십시오.
복잡한 정렬을 달성하려면 사용자 정의 기능과 함께 uasort ()를 사용할 수 있습니다.
<span><span><span class="hljs-title function_ invoke__">uasort</span></span><span>(</span><span><span class="hljs-variable">$users</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>[</span><span><span class="hljs-string">'score'</span></span><span>] == </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>]) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>] == </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'time'</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">// 후속 용도로 떠나십시오ksort프로세스 키 이름 정렬</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">'time'</span></span><span>] < </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>]) ? -</span><span><span class="hljs-number">1</span></span><span> : </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// 오름차순 시간</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">'score'</span></span><span>] > </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>]) ? -</span><span><span class="hljs-number">1</span></span><span> : </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// 하강 점수</span></span><span>
});
</span></span>uasort ()는 키 이름의 순서에 영향을 미치지 않기 때문에 ksort ()를 사용하여 키 이름을 정렬 할 수 있지만이 단계는 값이 동일 할 때만 의미가 있습니다. 중간 변환 구조를 사용할 수 있습니다.
<span><span><span class="hljs-comment">// 정렬 된 배열 키를 다시 그룹화하십시오</span></span><span>
</span><span><span class="hljs-variable">$temp</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$users</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-variable">$groupKey</span></span><span> = </span><span><span class="hljs-variable">$value</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>] . </span><span><span class="hljs-string">'-'</span></span><span> . </span><span><span class="hljs-variable">$value</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>];
</span><span><span class="hljs-variable">$temp</span></span><span>[</span><span><span class="hljs-variable">$groupKey</span></span><span>][</span><span><span class="hljs-variable">$key</span></span><span>] = </span><span><span class="hljs-variable">$value</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">$temp</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> &</span><span><span class="hljs-variable">$group</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">ksort</span></span><span>(</span><span><span class="hljs-variable">$group</span></span><span>); </span><span><span class="hljs-comment">// 키 이름 오름차순</span></span><span>
}
</span><span><span class="hljs-comment">// 최종 결과로 병합됩니다</span></span><span>
</span><span><span class="hljs-variable">$final</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$temp</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$group</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$group</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$k</span></span><span> => </span><span><span class="hljs-variable">$v</span></span><span>) {
</span><span><span class="hljs-variable">$final</span></span><span>[</span><span><span class="hljs-variable">$k</span></span><span>] = </span><span><span class="hljs-variable">$v</span></span><span>;
}
}
</span></span>현재 $ Final은 우리가 기대하는 것입니다. 점수의 하강 순서로 정렬, 오름차순 시간 순서 및 키 이름의 오름차순 순서입니다.
실제 프로젝트에서는 데이터를 평평하게하고 정렬 중량을 소개하며 Array_MultiSort () 와 함께 작동 할 수 있지만이 방법은 키 이름을 유지하는 데 그다지 친숙하지 않습니다. Arsort 와 Ksort를 조합하여 사용하면 연관 배열의 완전한 구조와 키 이름을 유지할 수 있습니다.
Arsort () 및 ksort () 자체는 다중 조건 분류 정렬을 직접 지원할 수는 없지만 그룹화 처리 및 다중 단계 분류 로직을 통해 UASORT () 와 같은 함수와 결합하여 SQL에서 COL1 DESC 및 COL2 ASC의 ORDER 와 유사한 효과를 유연하게 구현할 수 있습니다. 이러한 분류 기술을 마스터하면 복잡한 배열 데이터를 처리 할 때 개발자가 더 편안하게 도울 수 있습니다.