PHP 按字母顺序排序数组键,然后按数字顺序排序



我正在尝试按键对数组(包括字母键和数字键(进行排序,其中字母键将首先按字母顺序排列,然后按数字顺序排列数字键。

尝试使用所有可用的标志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()调用将返回truefalse。这些分别作为10进行比较。由于对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
(
)
)

相关内容

  • 没有找到相关文章

最新更新