Php 通过考虑两种不同的属性对多维数组进行排序

Php 通过考虑两种不同的属性对多维数组进行排序,php,arrays,sorting,Php,Arrays,Sorting,例如,我有一个数组 Array ( [0] => Array ( [id] => 6 [name] => ah [order] => 4 ) [1] => Array ( [id] => 5 [name] => hz [order] =>

例如,我有一个数组

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
        )
)
它需要先按“顺序”排序,如果顺序不可用,则按字母顺序用“名称”排序(但这些数组排在所有具有排序顺序的数组之后),如果没有“顺序”和“名称”,则排在数组末尾

因此,上述阵列需要变成:

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\u multisort吗

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

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

您看过array\u multisort吗

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

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

数组_multisort()
可能无法提供足够的控制来实现所需的排序

作为替代方案,您可以使用并提供自定义比较函数

例如:

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');
函数比较($a,$b){
if(空($a['order'])和&!空($b['order'])){
返回1;
}
如果(!empty($a['order'])和&empty($b['order'])){
返回-1;
}
如果($a['order']=$b['order']){
返回strnatcmp($a['name'],$b['name']);
}
退货($a['order']<$b['order'])?-1:1;
}
uasort($arr,'compare');
array\u multisort()
可能无法提供足够的控制来实现所需的排序

作为替代方案,您可以使用并提供自定义比较函数

例如:

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');
函数比较($a,$b){
if(空($a['order'])和&!空($b['order'])){
返回1;
}
如果(!empty($a['order'])和&empty($b['order'])){
返回-1;
}
如果($a['order']=$b['order']){
返回strnatcmp($a['name'],$b['name']);
}
退货($a['order']<$b['order'])?-1:1;
}
uasort($arr,'compare');

正在检查阵列多端口。Ps此代码没有返回正确排序的数组。@robertparé此代码只是使用数组_multisort的一个示例。通过将循环与排序相结合,您的问题应该得到解决。数组\u multisort($order,SORT\u ASC,$name,SORT\u ASC,$data);您能否给出答案,以便生成的数组是正确的?我在循环方面有问题,也找不到数组多端口的解决方案。正在检查数组多端口。Ps此代码没有返回正确排序的数组。@robertparé此代码只是使用数组_multisort的一个示例。通过将循环与排序相结合,您的问题应该得到解决。数组\u multisort($order,SORT\u ASC,$name,SORT\u ASC,$data);您能否给出答案,以便生成的数组是正确的?我在循环方面有问题,也找不到array multisort的解决方案。非常好,谢谢。我刚刚在$a['name']和$b['name']中都添加了strtolower(),否则排序不正确,非常好,谢谢。我刚刚将strtolower()添加到$a['name']和$b['name']中,否则排序不正确