Current Location: Home> Latest Articles> How to Use arsort and ksort Together to Achieve Multi-criteria Sorting?

How to Use arsort and ksort Together to Achieve Multi-criteria Sorting?

gitbox 2025-08-12

In PHP, array sorting is a common operation in data processing, especially when handling multidimensional arrays or situations that require sorting by multiple criteria. arsort() and ksort() are two frequently combined functions that allow orderly management of array values and keys. This article will explain in detail how to use these two functions together to achieve multi-criteria sorting, supported by specific code examples.

1. Basic Functions of arsort and ksort

  • arsort(): Sorts an array in descending order by its values while preserving the key associations.

  • ksort(): Sorts an array in ascending order by its keys while preserving key-value associations.

Although these two functions essentially sort by "values" and "keys" respectively, they can be combined in certain scenarios to implement more flexible multi-criteria sorting logic.

2. Example of Multi-criteria Sorting Requirements

Consider the following array representing scores of multiple users:

<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>

The sorting requirements are as follows:

  1. First, sort by score in descending order;

  2. If scores are equal, sort by completion time in ascending order;

  3. If both score and time are the same, sort by username (key) in ascending order.

3. Implementation Method

Step 1: Custom Sorting Logic

To implement complex sorting, you can use uasort() combined with a custom function:

<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> ($a['score'] == $b['score']) {
        </span><span><span class="hljs-keyword">if</span> ($a['time'] == $b['time']) {
            </span><span>return 0; </span><span><span class="hljs-comment">// Leave username sorting for later using ksort</span>
        }
        </span><span>return ($a['time'] < $b['time']) ? -1 : 1; </span><span><span class="hljs-comment">// Ascending order by time</span>
    }
    </span><span>return ($a['score'] > $b['score']) ? -1 : 1; </span><span><span class="hljs-comment">// Descending order by score</span>
});
</span></span>

Step 2: Handling Sorting by Key (Username)

Since uasort() does not affect key order, we can use ksort() to sort the keys only where values are equal. This can be done using an intermediate grouping structure:

<span><span><span class="hljs-comment">// Group the sorted array by key</span></span>
</span><span><span class="hljs-variable">$temp</span></span> = [];
</span><span><span class="hljs-keyword">foreach</span> ($users as $key => $value) {
    $groupKey = $value['score'] . '-' . $value['time'];
    $temp[$groupKey][$key] = $value;
}
<p></span>// Sort keys within each group<br>
foreach ($temp as &$group) {<br>
ksort($group); // Ascending order by key (username)<br>
}</p>
<p>// Merge groups into final result<br>
$final = [];<br>
</span>foreach ($temp as $group) {<br>
foreach ($group as $k => $v) {<br>
$final[$k] = $v;<br>
}<br>
}<br>
</span>

At this point, $final contains the expected results sorted by score descending, time ascending, and username ascending.

4. Simplified Implementation (Two-dimensional Sorting + Key)

In actual projects, you could flatten the data and assign sorting weights, then use array_multisort() to perform sorting. However, this method is not very friendly for preserving key names. Using arsort and ksort together keeps the associative array structure and keys intact.

5. Summary

arsort() and ksort() do not directly support multi-criteria sorting on their own. But by grouping and applying multi-step sorting logic combined with functions like uasort(), you can flexibly achieve effects similar to SQL's ORDER BY col1 DESC, col2 ASC. Mastering these sorting techniques will help developers handle complex array data more skillfully.