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

时间:2014-11-25 13:21:30

标签: php arrays sorting

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

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

我需要将此数组排序为,

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

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

3 个答案:

答案 0 :(得分:2)

TL; TR

最短的方式(在代码和经过一些基本的比较之后)是我在以下“Demo2”链接附近建议的代码:

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

您可以使用the ksort function

键对数组进行排序
ksort($array, SORT_STRING);

第二个参数告诉PHP将所有键(包括数字索引)作为字符串进行比较(意味着像3这样的索引将被视为'3')。这将为您提供一个数组,其中键以升序顺序。您显示的键的顺序(所有单个字符)将与它们各自的ASCII值相同(.为46,a为97,依此类推)。如果您想要撤销订单,则必须使用the array_reverse function

$array = array_reverse($array, true);

同样,第二个参数告诉PHP 保留密钥,否则,索引将被重置,留下数字索引的数组。

您可以使用the uksortfunction轻松跳过array_reverse来电。它的工作方式与ksort非常相似,但是将回调函数作为第二个参数,因此您也可以按索引排序,也可以按降序排序:

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

Demo

您会注意到这会将'.'键放在'!'键的前面。实际上,如果两个键的类型相同(数字,字母),那么您可能希望按升序对它们进行排序,这可以轻松完成:

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
});

Demo2

如果您的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');

答案 1 :(得分:2)

// 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");

答案 2 :(得分:2)

您可以尝试:

<?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()
)