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


Sort multi-dimensional array by considering 2 different properties

我有一个数组,例如

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

它需要首先按"顺序"进行排序,如果顺序不可用,则按字母顺序用"名称"进行排序(但这些数组位于所有具有排序顺序的数组之后),如果没有"顺序"answers"名称",则位于数组的末尾。

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

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] => 
        )
)

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

您看过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()可能无法提供足够的控制来实现所需的排序。

作为替代方案,您可以使用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');