通过考虑2个不同的属性对多维数组进行排序

时间:2015-02-11 16:24:32

标签: php arrays sorting

我有一个例如

的数组
Array
(
    [0] => Array
        (
            [id] => 6
            [name] => ah
            [order] => 4
        )
    [1] => Array
        (
            [id] => 5
            [name] => hz
            [order] => 
        )
    [2] => Array
        (
            [id] => 7
            [name] => ch
            [order] => 
        )

    [3] => Array
        (
            [id] => 5
            [name] => 
            [order] => 
        )

    [4] => Array
        (
            [id] => 4
            [name] => zh
            [order] => 1
        )
)

首先需要按" order"进行排序,如果订单不可用,则按字母顺序排序" name" (但是那些数组会追踪具有排序顺序的所有数组),如果没有" order"并且没有"名称",它位于数组的末尾。

所以上面的数组需要成为:

Array
(
    [0] => Array
        (
            [id] => 4
            [name] => zh
            [order] => 1
        )
    [1] => Array
        (
            [id] => 6
            [name] => ah
            [order] => 4
        )
    [2] => Array
        (
            [id] => 7
            [name] => ch
            [order] => 
        )
    [3] => Array
        (
            [id] => 5
            [name] => hz
            [order] => 
        )
    [4] => Array
        (
            [id] => 5
            [name] => 
            [order] => 
        )

)

我尝试了一些循环但没有接近解决方案。

2 个答案:

答案 0 :(得分:4)

你看过array_multisort吗?

foreach ($data as $key => $row) {
   $name[$key]  = $row['name'];
   $order[$key] = $row['order'];
}

array_multisort($name, SORT_DESC, $order, SORT_ASC, $data);

PHP array multisort

答案 1 :(得分:1)

array_multisort()可能无法提供足够的控制来实现您所需的排序。

作为替代方案,您可以使用uasort()并提供自定义比较功能。

例如:

function compare($a, $b) {
    if (empty($a['order']) && !empty($b['order'])) {
        return 1;
    }

    if (!empty($a['order']) && empty($b['order'])) {
        return -1;
    }

    if ($a['order'] == $b['order']) {
        return strnatcmp($a['name'], $b['name']);
    }

    return ($a['order'] < $b['order']) ? -1 : 1;
}

uasort($arr, 'compare');