我正在尝试按键对数组(包括字母键和数字键(进行排序,其中字母键将首先按字母顺序排列,然后按数字顺序排列数字键。
尝试使用所有可用的标志ksort
,但这没有帮助。尝试了几个SO答案,但没有一个符合我的目的。这是我拥有的数组的示例。
$array = array(
'Bat' => array(),
'Dog' => array(),
'Apple' => array(),
'Cat' => array(),
1 => array(),
3 => array(),
2 => array(),
4 => array()
);
我需要这样排序:
$array = array(
'Apple' => array(),
'Bat' => array(),
'Cat' => array(),
'Dog' => array(),
0 => array(),
1 => array(),
2 => array(),
3 => array()
);
我从 SO 答案中了解到,它可能需要自定义函数才能使用usort
函数进行排序。这就是我迷路的地方。任何帮助或正确方向的指导将不胜感激。
谢谢
如果您只使用英文字母和数字,通常的 ksort 函数工作正常
ksort($array);
print_r($array);
演示
正如@splash58所说,ksort(( 是所需要的。
也就是说,如果您的项目数据在字母顺序之前对数字数据进行排序,并且您需要颠倒这些组的顺序......
uksort(( 是最适合这项工作的函数。
*仔细选择您的关键评估功能:
- is_numeric(( 对什么是
true
有一个广泛的定义 - 请参阅手册。 - is_int(((及其别名 is_integer(((在检查数据类型时非常严格。 重要的是,像
"1"
这样的字符串键的计算结果为false
. - ctype_digit(( 虽然要求所有字符都是数字,但不适用于非字符串类型的值。 重要的是,像
8
这样的非字符串键的计算结果将false
.
如果你使用的是php7,你可以好好利用宇宙飞船操作员(<=>
(。 如果你的 php 版本是 sub-7,你可以使用任何你喜欢的 old-skool 比较。
我的解决方案允许宇宙飞船操作员在整数之前对非整数进行排序,然后对这些值 ASC 进行排序。
代码:(演示(
$array = [
2 => [],
'Bat' => [],
'Dog' => [],
12 => [],
'être' => [],
'Cat' => [],
1 => [],
3 => [],
'Apple' => [],
4 => []
];
uksort($array, function ($a, $b) {
return [is_int($a), $a] <=> [is_int($b), $b];
});
var_export($array);
is_int()
调用将返回true
或false
。这些分别作为1
和0
进行比较。由于对ASC进行排序,这意味着false
评估将在true
评估之前进行。
输出:(与ksort()
完全相同(
请不要介意这个问题。 我已经使用自定义函数管理了实现 bu。我在这里发布答案,以帮助有人遇到这个问题。
function ev_sort_array( $array ) {
$alp = array();
$num = array();
foreach ( $array as $key => $value ) {
if ( is_numeric($key) ) {
$num[$key] = $value;
} else {
$alp[$key] = $value;
}
}
ksort( $alp );
ksort( $num );
return array_merge( $alp, $num );
}
谢谢
你可以这样使用 uksort:
$array = array(
'Bat' => array(),
'Dog' => array(),
'Apple' => array(),
'Cat' => array(),
1 => array(),
3 => array(),
2 => array(),
4 => array()
);
uksort($array,function($a,$b){
if(is_int($a)&&is_int($b)) return $a-$b;
if(is_int($a)&&!is_int($b)) return 1;
if(!is_int($a)&&is_int($b)) return -1;
return strnatcasecmp($a,$b);
});
print_r($array);
输出符合预期:
Array
(
[Apple] => Array
(
)
[Bat] => Array
(
)
[Cat] => Array
(
)
[Dog] => Array
(
)
[1] => Array
(
)
[2] => Array
(
)
[3] => Array
(
)
[4] => Array
(
)
)