PHP 排序数组基于键的顺序,依次为字母表,然后是数字,然后是特殊字符


PHP sorting array based on keys in the order as alphabet then numberic and then special chars

我有一个如下所示的数组,

array(
   [!] = array(),
   [a] = array(),
   [.] = array(),
   [n] = array(),
   [3] = array(),
   [1] = array());

我需要将此数组排序为,

array(
   [a] = array(),
   [n] = array(),
   [1] = array(),
   [3] = array(),
   [!] = array(),
   [.] = array());

如何在 php() 中执行此操作?

TL;TR

最短的方法(无论是在代码方面还是经过一些基本比较)是我在下面的"Demo2"链接附近建议的代码:

uksort($arr, function($a, $b)
{
    if (ctype_alnum("$a") === ctype_alnum("$b"))
        return $a > $b;
    return "$a" < "$b";
});

您可以使用带有 ksort 函数的键对数组进行排序:

ksort($array, SORT_STRING);

第二个参数是告诉 PHP 将所有键(包括数字索引)作为字符串进行比较(这意味着像 3 这样的索引将被视为'3')。这将为您提供一个数组,其中键按升序排列。您显示的键的顺序(所有单个字符)将与其各自的 ASCII 值相同(.为 46,a为 97,依此类推)。看到你想要颠倒顺序,你必须使用array_reverse函数:

$array = array_reverse($array, true);

同样,第二个参数是告诉 PHP 保留键,如果没有,索引将被重置,留下一个数字索引数组。

您可以使用 uksort 函数轻松跳过array_reverse调用。它的工作方式与 ksort 大致相同,但将回调函数作为第二个参数,因此您也可以按索引降序排序:

uksort($arr, function($a, $b)
{
    return "$a" < "$b";//added quotes to convert to strings
});

演示

您会注意到,这会将'.'键放在'!'键的前面。实际上,如果两个键的类型相同(数字,字母),则似乎要按升序对它们进行排序,这很容易做到:

uksort($arr, function($a, $b)
{
    if (ctype_alnum("$a") === ctype_alnum("$b"))//both are alnums, sort ascending
        return $a > $b;//sort ascending
    return "$a" < "$b";//else sort descending
});

演示2

如果你的PHP版本不支持匿名函数,你可以定义一个函数并将其名称作为第二个参数传递,但实际上:你应该升级:

function sortDesc($a, $b)
{
    if (ctype_alnum("$a") === ctype_alnum("$b"))
        return $a > $b;
    return (string) $a < "$b";//casting is valid, too... both do the same thing
}
uksort($array, 'sortDesc');
// function to sort the array keys with
function compare($a, $b)
{
    // Look for [A-z]
    if (ctype_alpha($a)) {
        if (ctype_alpha($b)) {
            return strcasecmp($a, $b);
        } else {
            return -1;
        }
    } elseif (ctype_alpha($b)) {
        return 1;
    }
    if (is_int($a)) {
        if (is_int($b)) {
            return $a > $b;
        } else {
            return -1;
        }
    } elseif (is_int($b)) {
        return 1;
    }
    return $a > $b;
}
$a = array(
   '!' => array(),
   'a' => array(),
   '.' => array(),
   'n' => array(),
   '3' => array(),
   '1' => array()
);
// use the function we defined above to sort the array.
uksort($a, "compare");

你可以试试:

<?php
    $arr = array(
               '!' => array(),
               'a' => array(),
               '.' => array(),
               'n' => array(),
               '3' => array(),
               '1' => array(),
               '$' => array(),
               '8' => array(),
               'm' => array(),
               'x' => array(),
               'c' => array(),
            );
    function mySort($arr){
        $keys = array_keys($arr);
        sort($keys);
        $result = array();
        $temp = array();
        foreach($keys as $key){
            if(!is_numeric($key) && !ctype_alpha($key)){
                $temp[$key] = $arr[$key];
            }else{
                $result[$key] = $arr[$key];
            }
        }
        foreach($temp as $k => $v){
            $result[$k] = $v;
        }
        return $result;
    }

    print_r(mySort($arr));

?>

结果:

Array
(
    [a] => Array()
    [c] => Array()
    [m] => Array()
    [n] => Array()
    [x] => Array()
    [1] => Array()
    [3] => Array()
    [8] => Array()
    [!] => Array()
    [$] => Array()
    [.] => Array()
)