首页 > 解决方案 > 按姓氏对子数组进行排序

问题描述

我有一个按年份排序的数组,其中有一个带有姓氏键的数组。我正在寻找按姓氏对这些子数组进行排序。

我设法按年份分类。但是里面的数组不是按姓氏排序的。

[
    "1946" => [
        [
            "firstname" => "Juan",
            "lastname" => "Darcy"
        ], [
            "firstname" => "Franck",
            "lastname" => "Bolly"
        ]
    ],
    "1945" => [
        [
            "firstname" => "Pierre",
            "lastname" => "Carry"
        ], [
            "firstname" => "Catherine",
            "lastname" => "Aarron"
        ]
    ]
]

我会在不改变年份顺序的情况下按姓氏重新排序数组,如下所示:

[
    "1946" => [
        [
            "firstname" => "Franck",
            "lastname" => "Bolly"
        ], [
            "firstname" => "Juan",
            "lastname" => "Darcy"
        ]
    ],
    "1945" => [
        [
            "firstname" => "Catherine",
            "lastname" => "Aarron"
        ], [
            "firstname" => "Pierre",
            "lastname" => "Carry"
        ]
    ]
]

我试过这个:

$alumnis_array_number = [];
foreach ($alumnis_array_year as $value) {
    $year = $value['year'];
    $alumnis_array_number[$year][] = $value;
}

uasort($alumnis_array_number, function($a, $b) {
    return strcasecmp($a['lastname'], $b['lastname']);
});

但我得到了

未定义索引:姓氏

如何让这些子数组按姓氏排序?

标签: phparrays

解决方案


在按年份对数据进行分组之前执行排序似乎更容易。$alumnis_array_year因此,您将在执行问题中引用的代码之前进行排序:

uasort($alumnis_array_year, function($a, $b) {
    $diff = $b["year"] - $a["year"];
    if ($diff) return $diff;
    $diff = strcasecmp($a['lastname'], $b['lastname']);
    if ($diff) return $diff;
    return strcasecmp($a['firstname'], $b['firstname']);
});

如果你先这样做,然后执行你的代码,就可以了。


推荐阅读