ArsortをArray_Mapと組み合わせて使用して、複雑なデータをソートする最良の方法を実現する方法は?
PHPでは、 ArsortとArray_Mapは2つの非常に有用な機能です。前者は値で下降順に配列をソートするために使用されますが、後者は配列内の各要素をカスタマイズするために使用できます。これらの2つの関数を組み合わせて、特に多次元配列を扱う場合、または強力なアプリケーションシナリオを持つ特定の条件に基づいてデータを並べ替える必要がある場合、複雑なデータの並べ替えを実現できます。
この記事では、 ArsortとArray_Mapを使用して、複雑なデータを並べ替える最良の方法を実現し、実用的な例を通じて誰もがそれをよりよく理解する方法を説明します。
Arsort : Arsortは、インデックス関係を変化させないようにするために、下降順序で配列を並べ替えるために使用されます。配列の値が数値の場合、 Arsortはサイズごとに配列をソートし、値が文字列の場合、辞書の順序でソートされます。
array_map : array_mapを使用すると、アレイ内の各要素にコールバック関数を適用して、新しい配列を返すことができます。ソートする前に、 array_mapを使用して、配列の要素にデータを変換、フォーマット、または抽出して、ソート要件を満たします。
生徒の名前と成績を保存する多次元配列があるとします。
<span><span><span class="hljs-variable">$students</span></span><span> = [
[</span><span><span class="hljs-string">"name"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"score"</span></span><span> => </span><span><span class="hljs-number">90</span></span><span>],
[</span><span><span class="hljs-string">"name"</span></span><span> => </span><span><span class="hljs-string">"Bob"</span></span><span>, </span><span><span class="hljs-string">"score"</span></span><span> => </span><span><span class="hljs-number">75</span></span><span>],
[</span><span><span class="hljs-string">"name"</span></span><span> => </span><span><span class="hljs-string">"Charlie"</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">"name"</span></span><span> => </span><span><span class="hljs-string">"David"</span></span><span>, </span><span><span class="hljs-string">"score"</span></span><span> => </span><span><span class="hljs-number">95</span></span><span>]
];
</span></span>
これらの生徒をスコアごとに降順で並べ替えたいと考えています。
まず、 Array_Mapを使用してスコア(スコア)を抽出し、 Arsortで下降順序でスコアを並べ替え、最後にソートされたスコアに従って生徒の配列を再配置します。
<span><span><span class="hljs-comment">// 学生の結果を抽出します</span></span><span>
</span><span><span class="hljs-variable">$scores</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$student</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$student</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>];
}, </span><span><span class="hljs-variable">$students</span></span><span>);
</span><span><span class="hljs-comment">// 結果を降順で並べ替えます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">arsort</span></span><span>(</span><span><span class="hljs-variable">$scores</span></span><span>);
</span><span><span class="hljs-comment">// ソートされたグレードに基づいて学生アレイを再配置します</span></span><span>
</span><span><span class="hljs-variable">$sorted_students</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$scores</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> => </span><span><span class="hljs-variable">$score</span></span><span>) {
</span><span><span class="hljs-variable">$sorted_students</span></span><span>[] = </span><span><span class="hljs-variable">$students</span></span><span>[</span><span><span class="hljs-variable">$index</span></span><span>];
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$sorted_students</span></span><span>);
</span></span>
array_map : array_mapを使用して、各要素(学生ごと)の匿名関数を$ Student Arrayで実行し、学生の成績を返します。最後に、グレードのみを含む$スコアの配列を取得します。
ARSORT : Arsortを使用して、スコアアレイを降順でソートして、高い成績を持つ学生が最前線にいることを確認します。
生徒の配列を再配置する: Arsortはグレードでソートされた配列を返しますが、ソートされたインデックスに従って元の学生アレイを再配置する必要もあります。ここでは、 foreachループを使用して、ソートされたグレードインデックスに従って、学生配列$の学生の要素を順番に取り出し、新しいソートされた学生アレイ$ sorted_studentsを形成します。
最初にグレードごとにソートするなど、複数の基準で並べ替える必要があると仮定します。グレードが同じ場合、名前のアルファベット順の順序でソートする必要があります。この時点で、 array_mapを使用してこれらの条件を処理し、 Arrayとarray_multisortを組み合わせて複雑なソートを完了できます。
<span><span><span class="hljs-variable">$students</span></span><span> = [
[</span><span><span class="hljs-string">"name"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"score"</span></span><span> => </span><span><span class="hljs-number">90</span></span><span>],
[</span><span><span class="hljs-string">"name"</span></span><span> => </span><span><span class="hljs-string">"Bob"</span></span><span>, </span><span><span class="hljs-string">"score"</span></span><span> => </span><span><span class="hljs-number">75</span></span><span>],
[</span><span><span class="hljs-string">"name"</span></span><span> => </span><span><span class="hljs-string">"Charlie"</span></span><span>, </span><span><span class="hljs-string">"score"</span></span><span> => </span><span><span class="hljs-number">90</span></span><span>],
[</span><span><span class="hljs-string">"name"</span></span><span> => </span><span><span class="hljs-string">"David"</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-comment">// スコアと名前を抽出します</span></span><span>
</span><span><span class="hljs-variable">$scores</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$student</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$student</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>];
}, </span><span><span class="hljs-variable">$students</span></span><span>);
</span><span><span class="hljs-variable">$names</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$student</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$student</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>];
}, </span><span><span class="hljs-variable">$students</span></span><span>);
</span><span><span class="hljs-comment">// グレードの降順でソートします,昇順でソートします</span></span><span>
</span><span><span class="hljs-title function_ invoke__">array_multisort</span></span><span>(</span><span><span class="hljs-variable">$scores</span></span><span>, SORT_DESC, </span><span><span class="hljs-variable">$names</span></span><span>, SORT_ASC, </span><span><span class="hljs-variable">$students</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$students</span></span><span>);
</span></span>
この例では、 array_multisortを使用して、複数の配列に基づいてデータをソートできます。まず、スコアの降順で並べ替え、成績が同じ場合は、名前で昇順でソートします。
ArsortとArray_Mapの組み合わせは、複雑なデータソートに強力な機能を提供します。 array_mapを介してデータを処理したり、ソート前にキーフィールドを抽出したり、 array_multisortを介したり、 Array_multisortと組み合わせて多条件のソートを並べ替えて並べ替えます。
これらの機能を柔軟に使用することにより、多次元配列と複雑なデータを処理するときに、より効率的かつ便利にソートすることができ、コードの読みやすさと実行効率を改善できます。
関連タグ:
array_map