PHP按字母顺序和数字顺序对数组键排序
我正在尝试对一个包含字母键和数字键的数组按键排序,其中字母键将首先按字母顺序排列,然后按数字顺序排列 尝试使用所有可用标志进行ksort,但是没有帮助。我试过几个这样的答案,但没有一个符合我的目的。下面是我所拥有的数组的一个示例PHP按字母顺序和数字顺序对数组键排序,php,arrays,sorting,usort,ksort,Php,Arrays,Sorting,Usort,Ksort,我正在尝试对一个包含字母键和数字键的数组按键排序,其中字母键将首先按字母顺序排列,然后按数字顺序排列 尝试使用所有可用标志进行ksort,但是没有帮助。我试过几个这样的答案,但没有一个符合我的目的。下面是我所拥有的数组的一个示例 $array = array( 'Bat' => array(), 'Dog' => array(), 'Apple' => array(), 'Cat' => array(), 1 => array
$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函数进行排序。那就是我迷路的地方。如能提供正确方向的任何帮助或指导,将不胜感激
谢谢请不要介意这个问题。我已使用自定义函数管理实现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
(
)
)
如果您只使用英文字母和数字,通常的ksort函数可以正常工作
ksort($array);
print_r($array);
正如@splash58所说,这就是所需要的一切
这就是说,如果您的项目数据是按字母顺序排列的数字数据,并且您需要颠倒这些组的顺序
是这项工作最直接/最合适的职能
*仔细选择您的关键评估功能:
对什么是正确的有一个广泛的定义-参见手册。
并且它的别名在检查数据类型时非常严格。重要的是,像1这样的字符串键将计算为false。
,虽然要求所有字符都是数字,但不适用于非字符串类型的值。重要的是,像8这样的非字符串键将计算为false。
如果您使用的是php7,则可以充分利用。如果您的php版本是sub-7,您可以使用任何您喜欢的旧skool比较
我的解决方案允许spaceship操作符将非整数排序在整数之前,然后将这些值按ASC排序
代码:
is_int调用将返回true或false。它们分别比较为1和0。由于对ASC进行排序,这意味着假评估将先于真评估
输出:与ksort完全相同@splash58是最短的解决方案。你应该把它写进一个答案。@splash58我无法重现这个问题:我不确定你是否理解它的工作原理:-@splash58…我应该用ksort来解释。。。我可以设计一个样本集来重现排序不当的输出。奇怪的当我测试时,ksort首先返回数字键。谢谢你,哈!在我费心用一个效率较低/直接的片段写出如此全面的答案之前,我希望我已经阅读了你的答案。哦,好吧,其中有一些有价值的见解,未来的研究人员可能会发现这些见解很有帮助。有什么线索可以解释OP的输入数组为什么不服从ksort吗?@Abhik这在你的项目中并没有提供期望的结果吗?我们可以看到您的项目数据的更真实的表示吗?您使用的是什么php版本?@mickmackusa我看到两种变体:XY问题或在real project中使用非英语字母。@mickmackusa我使用的是PHP7.2。ksort实际上按字母和数字对数组进行排序。然而,我首先需要字母键,然后是数字键。ksort的作用正好相反,它先返回数字键,然后返回字母键;因为任何非dogit字符串都小于任何数字?嗯。我想我没有超出样本数据的范围。我没想那么远。
$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);