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

时间:2014-02-17 04:03:14

标签: php arrays sorting multidimensional-array

我的阵列:

$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"
                )

        )

)

我想根据内心的内容对$MY_ARRAY直接孩子进行排序, 理想情况下,按 start_year,start_month,end_year,end_month 的顺序排列。我想我可以用某种方式使用array_multisort(),但我不知道怎么做。有谁知道如何处理这个?

感谢。

编辑:正如它出现的那样,解决方案很简单,我不知道的是,在回调比较功能的比较过程中你可以进入更深层的结构 - 所以如果你的比lvl-1索引更深的仍然总是相同的(我的情况)就是如何做到这一点:)

3 个答案:

答案 0 :(得分:1)

为此,您可以使用uasort功能:

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');

答案 1 :(得分:1)

您可以使用PHP的usort功能并提供您自己的比较功能。像这样:

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");

上面将按start_year对数组进行排序。我还没有对代码进行测试,但它应该有效。

答案 2 :(得分:0)

执行以下操作:

$newArray = array();
foreach($MY_ARRAY as $value) {
    $newArray[] = $value[1];
}
multi_sort($newArray, $MY_ARRAY);