按多个用户定义的值对多维数组进行排序

时间:2015-01-23 21:30:39

标签: php arrays sorting multidimensional-array

我需要用两个值对多维数组进行排序。

例如在数组中将有4个键。

Array(
    Array
    (
        [0] => 4B642D022980E5EBAA7CF4B6E1CC93769921CB42
        [1] => downloading
        [2] => Title
        [3] => 60
    )
    Array
    (
        [0] => 4B642D022980E5EBAA7CF4B6E1CC93769921CB42
        [1] => downloading
        [2] => Title
        [3] => 30
    )
    Array
    (
        [0] => 4B642D022980E5EBAA7CF4B6E1CC93769921CB42
        [1] => paused
        [2] => Title
        [3] => 30
    )
    Array
    (
        [0] => 4B642D022980E5EBAA7CF4B6E1CC93769921CB42
        [1] => completed
        [2] => Title
        [3] => 100
    )
)

有没有办法我可以对数组进行排序,以便它首先按键完成对数组进行排序,然后下载第二个,然后暂停第三个,然后对包含下载的数组进行排序,并通过{{从100减少到0。 1}}键?

所需的输出将是

3

3 个答案:

答案 0 :(得分:1)

uksort就是您所需要的。

这是一种允许您定义自己的回调函数的排序。

然后uksort使用此回调函数对数组重新排序。

您需要编写一个基于两个标准对数组进行排序的函数。

第一个是你阵列的indice 1中字段的字母顺序(包含完成,下载,......的单词),如果是tie,你可以使用你的数组的indice 3中的字段和按降序排序。

最后,您需要将您创建的函数作为参数传递给uksort。

希望它有所帮助! :)

答案 1 :(得分:1)

您需要重新格式化数组并使用array_multisort。它还会使思考更具可读性:

<?php $ar = Array(
    Array(
        "id" => "4B642D022980E5EBAA7CF4B6E1CC93769921CB42",
        "status" => "completed",
        "title" => "Title",
        "rank" => "100",
    ),
    Array
    (
        "id" => "4B642D022980E5EBAA7CF4B6E1CC93769921CB42",
        "status" => "downloading",
        "title" => "Title",
        "rank" => "60",
    ),
    Array
    (
        "id" => "4B642D022980E5EBAA7CF4B6E1CC93769921CB42",
        "status" => "downloading",
        "title" => "Title",
        "rank" => "30",
    ),
    Array
    (
        "id" => "4B642D022980E5EBAA7CF4B6E1CC93769921CB42",
        "status" => "paused",
        "title" => "Title",
        "rank" => "30",
    ),
);
var_dump($ar);
foreach ($ar as $key => $row) {
    $status[$key] = $row['status'];
    $rank[$key] = $row['rank'];
}

array_multisort($status, SORT_ASC, $rank, SORT_DESC, $ar);
var_dump($ar);

答案 2 :(得分:0)

    $array = [
        [
            '4B642D022980E5EBAA7CF4B6E1CC93769921CB42',
            'downloading',
            'Title',
            '60',
        ],
        [
            '4B642D022980E5EBAA7CF4B6E1CC93769921CB42',
            'downloading',
            'Title',
            '30',
        ],
        [
            '4B642D022980E5EBAA7CF4B6E1CC93769921CB42',
            'paused',
            'Title',
            '30',
        ],
        [
            '4B642D022980E5EBAA7CF4B6E1CC93769921CB42',
            'completed',
            'Title',
            '100',
        ]
    ];


    usort($array, function($a, $b) {
        if ($a[1] == $b[1]) {
            if ($a[3] == $b[3]) {
                return 0;
            }

            return ($a[3] > $b[3]) ? -1 : 1;
        }

        $status = ['completed', 'downloading', 'paused'];

        foreach ($status as $st) {
            if ($a[1] == $st)
                return -1;
            if ($b[1] == $st)
                return 1;
        }

        return 0;
    });


    var_dump($array);