PHP:使用给定的字段顺序对多级数组进行排序,使其比级别1维度值更深

PHP: Sort multi-array by deeper than level-1 dimension values with given field order

本问题已经有最佳答案,请猛点这里访问。

我的数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$MY_ARRAY =
Array
(
    [0] => Array
        (
            [0] => 2861
            [1] => Array
                (
                    [start_month] => 6
                    [start_year] => 1970
                    [end_month] => 12
                    [end_year] => 1990
                    [experience_info] =>"Practically a random string"
                )

        )

)

我想根据孩子们的内在内容对他们进行分类。理想情况下,按开始年份、开始月份、结束年份、结束月份的顺序排列。我想我可以用一下array_multisort(),但我不知道怎么用。有人知道怎么处理这个吗?

谢谢。

编辑:正如它所显示的,解决方案是好的和简单的,我不知道的是,在回调比较函数的比较过程中,您可以进入更深的结构-因此,如果您的比lvl-1更深的索引始终保持不变(我的情况),那就是如何做它:)


您可以使用PHP的usort函数并提供自己的比较函数。这样地:

1
2
3
4
5
6
7
8
9
10
11
function cmp($a, $b)
{
    if ($a[1]['start_year'] == $b[1]['start_year'])
    {
        // You can further do tests for start_month, etc in here if start_years are equal
        return 0;
    }
    return ($a[1]['start_year'] > $b[1]['start_year']) ? 1 : -1;
}

usort($MY_ARRAY,"cmp");

上面将按开始年份对数组进行排序。我还没有测试代码,但它应该可以工作。


为此,您可以使用uasort函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function compare_callback($arr1, $arr2) {
    $start_year1 = $arr1[1]['start_year'];
    $start_year2 = $arr2[1]['start_year'];

    $start_month1 = $arr1[1]['start_month'];
    $start_month2 = $arr2[1]['start_month'];

    $end_year1 = $arr1[1]['end_year'];
    $end_year2 = $arr2[1]['end_year'];

    $end_month1 = $arr1[1]['end_month'];
    $end_month2 = $arr2[1]['end_month'];

    return ($start_year1 === $start_year2)
        ? (($start_month1 === $start_month2)
            ? (($end_year1 === $end_year2)
                ? (($end_month1 === $end_month2)
                    ? 0
                    : (($end_month1 < $end_month2) ? -1 : 1))
                : (($end_year1 < $end_year2) ? -1 : 1))
            : ($start_month1 < $start_month2) ? -1 : 1)
        : (($start_year1 < $start_year2) ? -1 : 1);
}

uasort($array, 'compare_callback');


执行如下操作:

2