現在の位置: ホーム> 最新記事一覧> ArsortがKSORTと組み合わせて使用されている場合、マルチコンディショナルソートを実装するための具体的な方法は何ですか?

ArsortがKSORTと組み合わせて使用されている場合、マルチコンディショナルソートを実装するための具体的な方法は何ですか?

gitbox 2025-08-12

PHPでは、アレイのソートは、特に多次元アレイまたは多条件付きソートが必要なシナリオに直面している場合に、データ処理の一般的な操作です。適切なソート機能を選択することが特に重要です。 arsort()ksort()は、組み合わせでよく使用される2つの関数です。それらの組み合わせにより、配列の値とキーは整然と管理できます。この記事では、これらの2つの機能が組み合わせてどのように使用され、組み合わせて多条件の並べ替えを実現するかを詳細に説明します。

1。ArsortとKsortの基本機能

  • Arsort() :配列を降順で並べ替え、キー名を保持し、「値」でソートします。

  • KSORT() :キー値を保持して、「キー」で配列を昇順で並べ替えます。

これらの2つの関数は、基本的に「値」と「キー」をそれぞれ並べ替えていますが、いくつかのシナリオでは、より柔軟なマルチコンディショナルソートロジックを実現するために一緒に使用できます。

2。マルチコンディショナルソート要件の例

複数のユーザーのスコアレコードを表すために次のように配列があるとします。

 <span><span><span class="hljs-variable">$users</span></span><span> = [
    </span><span><span class="hljs-string">'user3'</span></span><span> =&gt; [</span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">85</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> =&gt; </span><span><span class="hljs-number">120</span></span><span>],
    </span><span><span class="hljs-string">'user1'</span></span><span> =&gt; [</span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">92</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> =&gt; </span><span><span class="hljs-number">110</span></span><span>],
    </span><span><span class="hljs-string">'user2'</span></span><span> =&gt; [</span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">85</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> =&gt; </span><span><span class="hljs-number">100</span></span><span>],
    </span><span><span class="hljs-string">'user4'</span></span><span> =&gt; [</span><span><span class="hljs-string">'score'</span></span><span> =&gt; </span><span><span class="hljs-number">92</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> =&gt; </span><span><span class="hljs-number">130</span></span><span>],
];
</span></span>

現在の要件は次のとおりです。

  1. スコア(スコア)で最初のソート。

  2. スコアが同じ場合は、完了時間(時間)までに昇順で並べ替えます。

  3. スコアと時間が同じ場合は、ユーザー名(キー名)で昇順で並べ替えます。

実装方法

ステップ1:ソートロジックをカスタマイズします

複雑なソートを実現するには、 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>] &lt; </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>] &gt; </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>

ステップ2:キー名の同じ並べ替えを処理します

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> =&gt; </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> &amp;</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> =&gt; </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は私たちが期待するものであり、スコアの降順で並べ替え、昇順の順序、およびキー名の昇順です。

4。簡素化されたバージョンの実装(2次元ソート +キー名)

実際のプロジェクトでは、データを平らにしたり、整理重量を導入したり、 array_multisort()と組み合わせて動作したりすることもできますが、この方法はキー名を維持するのにそれほど友好的ではありません。 ArsortKsortを組み合わせて使用することにより、連想配列の完全な構造とキー名を保持できます。

5。概要

Arsort()およびKsort()自体は、マルチコンディショナルソートを直接サポートすることはできませんが、グループ化処理とマルチステップソートロジックを使用すると、 uaSort()などの関数と組み合わせて、SQLのCol1 DESCおよびCOL2 ASCの順序と同様の効果を柔軟に実装できます。これらのソートテクニックをマスターすると、複雑な配列データを扱う際に開発者がより快適になるのに役立ちます。