PHPでは、アレイのソートは、特に多次元アレイまたは多条件付きソートが必要なシナリオに直面している場合に、データ処理の一般的な操作です。適切なソート機能を選択することが特に重要です。 arsort()とksort()は、組み合わせでよく使用される2つの関数です。それらの組み合わせにより、配列の値とキーは整然と管理できます。この記事では、これらの2つの機能が組み合わせてどのように使用され、組み合わせて多条件の並べ替えを実現するかを詳細に説明します。
Arsort() :配列を降順で並べ替え、キー名を保持し、「値」でソートします。
KSORT() :キー値を保持して、「キー」で配列を昇順で並べ替えます。
これらの2つの関数は、基本的に「値」と「キー」をそれぞれ並べ替えていますが、いくつかのシナリオでは、より柔軟なマルチコンディショナルソートロジックを実現するために一緒に使用できます。
複数のユーザーのスコアレコードを表すために次のように配列があるとします。
<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の順序と同様の効果を柔軟に実装できます。これらのソートテクニックをマスターすると、複雑な配列データを扱う際に開発者がより快適になるのに役立ちます。