Php 如何按字母数字值对多维数组排序?

Php 如何按字母数字值对多维数组排序?,php,arrays,Php,Arrays,我有一个如下的数组 Array ( [2] => Array ( [id] => 75 [program] => Apr 2020-Nov 2020 ) [1] => Array ( [id] => 73 [program] => Feb 2016-Aug 2020 ) [0

我有一个如下的数组

Array
(
    [2] => Array
        (
            [id] => 75
            [program] => Apr 2020-Nov 2020
        )

    [1] => Array
        (
            [id] => 73
            [program] => Feb 2016-Aug 2020
        )

    [0] => Array
        (
            [id] => 72
            [program] => May 2020-Dec 2020
        )

)
结果数组应为

Array
(


    [1] => Array
        (
            [id] => 73
            [current_program] => Feb 2016-Aug 2020
        )
    [2] => Array
        (
            [id] => 75
            [current_program] => Apr 2020-Nov 2020
        )

    [0] => Array
        (
            [id] => 72
            [current_program] => May 2020-Dec 2020
        )

)
它应该根据年份进行排序。我曾尝试通过“strnatcasecmp”实现,但数组是按字母排序的,而不是按数组中的数值排序的

    usort($programp, function($a, $b) {
        return strnatcasecmp($a['program'], $b['program']);
    });
任何帮助都将不胜感激


谢谢

您需要将第一个月和第一年转换为时间戳,对其进行排序,从而对原始数据进行排序:

foreach($programp as $values) {
    $starts[] = strtotime(explode('-', $values['program'])[0]);
} 
array_multisort($starts, $programp);
排序前,
$starts
数组如下所示,易于排序:

Array
(
    [0] => 1585692000
    [1] => 1454281200
    [2] => 1588284000
)
您可能需要进行一些错误检查,以确保
$values['program']
不是空的等等

//Sort indexes so the keys are 0,1,2 instead of 1,2,0
//This is important when sorting down below with asort()
$arr = array_values($arr); 

//Go through every "program" (dateinterval in your array)
//and make a new array in the format year-monthnr
//Date parse returns the number of jan(1),feb(2),mar(3) etc..
$year_month = [];
foreach(array_column($arr,'program') as $key => $item) {       
    $year = explode(' ', explode('-',$item)[0])[1];
    $month = date_parse(explode(' ', explode('-',$item)[0])[0])['month'];
    $year_month[] = $year . '-' . $month;
}

//Sort with mainted indexes (keys)
asort($year_month); 

//Create new array "mapped" keys to the original array $arr
$new_arr = [];
foreach($year_month as $key=>$item) {
    $new_arr[] = $arr[$key];
}
$new\u arr
的输出为:

Array
(
    [0] => Array
        (
            [id] => 73
            [program] => Feb 2016-Aug 2020
        )

    [1] => Array
        (
            [id] => 75
            [program] => Apr 2020-Nov 2020
        )

    [2] => Array
        (
            [id] => 72
            [program] => May 2020-Dec 2020
        )

)

为什么它会起作用<4月份的code>A在2月份的
F
之前。您写道希望按年份对数组进行排序。有两年,例如“2016年2月至2020年8月”,2016年开始,2020年结束。你想按哪一个排序?你放弃了吗?