首页  >  文章  >  后端开发  >  在 PHP 中使用 uasort 对关联数组进行排序时如何保持键顺序?

在 PHP 中使用 uasort 对关联数组进行排序时如何保持键顺序?

Patricia Arquette
Patricia Arquette原创
2024-11-03 18:44:02127浏览

How Can I Maintain Key Order While Sorting Associative Arrays in PHP Using uasort?

使用 uasort 维护 PHP 排序中的键顺序

当使用 uasort 函数对 PHP 中的关联数组进行排序时,可以强制执行即使多个键共享相同的值,也能保留原始键顺序的稳定排序。

解决方案

由于 PHP 默认不再支持稳定排序,因此需要自定义函数是必需的:

<code class="php">function mergesort(&$array, $cmp_function = 'strcmp') {
    // Base cases for arrays of size < 2
    if (count($array) < 2) return;
    // Split the array in half
    $halfway = count($array) / 2;
    $array1 = array_slice($array, 0, $halfway);
    $array2 = array_slice($array, $halfway);
    // Recursively sort the halves
    mergesort($array1, $cmp_function);
    mergesort($array2, $cmp_function);
    // Handle case if $array1 is entirely less than $array2
    if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {
        $array = array_merge($array1, $array2);
        return;
    }
    // Merge the two sorted arrays
    $array = array();
    $ptr1 = $ptr2 = 0;
    while ($ptr1 < count($array1) && $ptr2 < count($array2)) {
        if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1) {
            $array[] = $array1[$ptr1++];
        } else {
            $array[] = $array2[$ptr2++];
        }
    }
    // Merge the remainder
    while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
    while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
    return;
}</code>

用法

只需使用 mergesort 函数对关联数组进行排序,将其作为第一个参数传递,并传递一个用于比较值的匿名函数 (可选):

<code class="php">uasort($arr, function($a, $b){
    return ($a == $b)?1:($a - $b);
});</code>

以上是在 PHP 中使用 uasort 对关联数组进行排序时如何保持键顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn