代码之家  ›  专栏  ›  技术社区  ›  mezzomix

按字母排序数组,然后按不起作用的数字排序

  •  2
  • mezzomix  · 技术社区  · 6 年前

    /开始更新/

    如果我的目标是单个数组,而不是数组数组,那么下面的解决方案将起作用。

    这只是关联数组的一个块,每个分组的块都需要排序。请参见更新的数组。

    我试过以下几次,但似乎没有击中子阵:

    function natorder($a, $b){
      return strnatcmp( $a['name'], $b['name'] );
    }
    usort($array, 'natorder');
    

    /更新结束/

    尝试变化 usort , sort 以及以下功能:

    function sortNames($a, $b){
     return $a['name'] - $b['name'];
    }
    

    我无法对数组排序:

        [abc-abc] => Array
            (
                [0] => Array
                    (
                        [name] => abc-abc-34
                        [qty] => 4
                        [sub_qty] => 4
                        [area] => G11
                    )
    
                [1] => Array
                    (
                        [name] => abc-abc-45
                        [qty] => 145
                        [sub_qty] => 146
                        [area] => G11
                    )
    
                [2] => Array
                    (
                        [name] => abc-abc-67
                        [qty] => 215
                        [sub_qty] => 100, 
    116
                        [area] => T, 
    G12
                    )
    
                [3] => Array
                    (
                        [name] => abc-abc-56
                        [qty] => 0
                    )
    
            )
        [def-def] => Array
            (
                [0] => Array
                    (
                        [name] => def-def-34
                        [qty] => 4
                        [sub_qty] => 4
                        [area] => G11
                    )
    
                [1] => Array
                    (
                        [name] => def-def-45
                        [qty] => 145
                        [sub_qty] => 146
                        [area] => G11
                    )
    
                [2] => Array
                    (
                        [name] => def-def-56
                        [qty] => 0
                    )
    
            )
    

    以下内容:

            [abc-abc] => Array
                (
                    [0] => Array
                        (
                            [name] => abc-abc-34
                            [qty] => 4
                            [sub_qty] => 4
                            [area] => G11
                        )
    
                    [1] => Array
                        (
                            [name] => abc-abc-45
                            [qty] => 145
                            [sub_qty] => 146
                            [area] => G11
                        )
    
                    [2] => Array
        (
                            [name] => abc-abc-56
                            [qty] => 0
                        )
    
    
                    [3] => Array
                        (
                            [name] => abc-abc-67
                            [qty] => 215
                            [sub_qty] => 100, 
        116
                            [area] => T, 
        G12
                        )
    
                )
    [def-def] => Array
                (
                    [0] => Array
                        (
                            [name] => def-def-34
                            [qty] => 4
                            [sub_qty] => 4
                            [area] => G11
                        )
    
                    [1] => Array
                        (
                            [name] => def-def-45
                            [qty] => 145
                            [sub_qty] => 146
                            [area] => G11
                        )
    
                    [2] => Array
                        (
                            [name] => def-def-56
                            [qty] => 0
                        )
    
                )
    

    是否需要说明中不存在的附加密钥 abc-abc-56 ?是否有替代工具或功能我应该使用?

    名称的格式总是3个字母,一个破折号,后面跟着3个字母,但之后会随着其他字符和数字的变化而变化。所以可能是:

    ABC-ABC-1、ABC-ABC1、ABC.1或ABC-ABC-1

    但我最关心的是第一个模式被正确排序。

    非常感谢您的评论!

    1 回复  |  直到 6 年前
        1
  •  1
  •   The fourth bird    6 年前

    如果有多维数组,可以使用 array_map 使用 usort 在回调函数中。

    在usort use的回调中 strnatcmp .

    例如:

    $array = array_map(function($x){
        usort($x, function($a, $b){
            return strnatcmp($a['name'], $b['name']);
        });
        return $x;
    }, $array);
    

    Demo

    对于具有多个名称的单个数组,可以使用:

    function sortNames($a, $b)
    {
        return strnatcmp($a['name'], $b['name']);
    }
    
    usort($array, "sortNames");
    print_r($array);
    

    Demo