PHP 根据键排序数组,顺序为字母顺序,然后是数字,然后是特殊字符

标签 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() 中执行此操作?

最佳答案

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

您会注意到,这会将 '.' 键放在 '!' 键的前面。事实上,如果两个键的类型相同(数字、alpha),看起来您想按升序对它们进行排序,这很容易做到:

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

关于PHP 根据键排序数组,顺序为字母顺序,然后是数字,然后是特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27127911/

相关文章:

javascript - PHP - 发布到自己而不刷新(或其他选择)

php - 如何通过 Magento API 以编程方式将属性分配给特定属性集?

c - 如何将二进制数组转换为其 2 的补码?

c - printf 打印超过数组的大小

java - java中的多重排序

php - UTF-8贯穿始终

javascript - 如何将这种类型的数组转换为json对象呢?

javascript - javascript 中未定义值的排序工作不正确

sorting - vim 中可以对一组行进行排序吗?

php - 从默认数据库标题更改 csv 导出标题