PHP按字母顺序和数字顺序对数组键排序

PHP按字母顺序和数字顺序对数组键排序,php,arrays,sorting,usort,ksort,Php,Arrays,Sorting,Usort,Ksort,我正在尝试对一个包含字母键和数字键的数组按键排序,其中字母键将首先按字母顺序排列,然后按数字顺序排列 尝试使用所有可用标志进行ksort,但是没有帮助。我试过几个这样的答案,但没有一个符合我的目的。下面是我所拥有的数组的一个示例 $array = array( 'Bat' => array(), 'Dog' => array(), 'Apple' => array(), 'Cat' => array(), 1 => array

我正在尝试对一个包含字母键和数字键的数组按键排序,其中字母键将首先按字母顺序排列,然后按数字顺序排列

尝试使用所有可用标志进行ksort,但是没有帮助。我试过几个这样的答案,但没有一个符合我的目的。下面是我所拥有的数组的一个示例

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