首页 > 解决方案 > 按字母排序数组然后数字不起作用

问题描述

/ 开始更新 /

如果我针对单个数组数组而不是数组数组数组,则以下解决方案将起作用。

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

我尝试了以下方法,但它似乎没有击中子数组:

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

/ 更新结束 /

尝试变体usortsort以及以下功能:

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-abc.1 或 abc-abc_1

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

非常感谢您的评论!

标签: phparrayssorting

解决方案


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

在 usort 的回调中使用strnatcmp

例如:

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

演示

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

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

usort($array, "sortNames");
print_r($array);

演示


推荐阅读