我有一个如下所示的数组,
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()
)