PHP按字母顺序然后按数字顺序对数组键进行排序

时间:2018-08-20 16:20:41

标签: php arrays sorting usort ksort

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

尝试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函数进行排序。那就是我迷路的地方。任何帮助或指导正确的方向将不胜感激。

谢谢

4 个答案:

答案 0 :(得分:3)

如果仅使用英文字母和数字,则通常的ksort函数可以正常工作

df = pd.DataFrame( {'Borough':['MANHATTAN','BROOKLYN','BROOKLYN','QUEENS','QUEENS','BROOKLYN','MANHATTAN','MANHATTAN','MANHATTAN']})
df['Borough'].value_counts(dropna=False).plot(kind='bar')
plt.show()

demo

答案 1 :(得分:2)

请不要介意这个问题。我已经使用自定义功能管理实现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 );
}  

谢谢

答案 2 :(得分:2)

您可以通过以下方式使用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
        (
        )

)

答案 3 :(得分:2)

如@ splash58所述,ksort()就足够了。

也就是说,如果您的项目数据是按字母顺序对数字数据进行排序,那么您需要颠倒这些组的顺序...

uksort()是这项工作最直接/最合适的功能。

*请仔细选择关键评估功能:

  • is_numeric()对符合true的内容进行了广泛定义-请参见手册。
  • is_int()(及其别名is_integer())在检查数据类型方面非常严格。重要的是,像"1"这样的字符串键的求值为false
  • ctype_digit()尽管要求所有字符均为数字,但不适用于非字符串类型的值。重要的是,像8这样的非字符串键的计算结果为false

您的排序逻辑说:在将数字与非数字进行比较时,请反转默认的排序结果

如果您使用的是php7,则可以充分利用spaceship operator<=>)。如果您的php版本低于7,则可以使用任何喜欢的旧版本比较。

当两个值都是数字或两个值都是非数字时,我的解决方案允许飞船操作​​员订购ASC。当一个是数字而另一个不是数字时,请颠倒$a$b的位置以进行DESC排序。

代码:(Demo

$array = [
    2 => [],
    'Bat' => [],
    'Dog' => [],
    'Cat' => [],
    1 => [],
    3 => [],
    'Apple' => [],
    4 => []
];

uksort($array, function ($a, $b){
    return is_int($a) != is_int($b) ? $b <=> $a : $a <=> $b;
});

var_export($array);

输出:(是的,我意识到这不是所需的输出,但这是有条件地反转排序顺序的所需技术。)

array (
  1 => 
  array (
  ),
  2 => 
  array (
  ),
  3 => 
  array (
  ),
  4 => 
  array (
  ),
  'Apple' => 
  array (
  ),
  'Bat' => 
  array (
  ),
  'Cat' => 
  array (
  ),
  'Dog' => 
  array (
  ),
)