Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中按多个嵌套值排序和数组?_Php_Arrays_Sorting - Fatal编程技术网

在PHP中按多个嵌套值排序和数组?

在PHP中按多个嵌套值排序和数组?,php,arrays,sorting,Php,Arrays,Sorting,好吧,这个很复杂。。。假设我有一个名为$data的数组 Array ( [9e5b0d6d-711c-4cd0-8697-634a5c640066] => Array ( [player] => 9e5b0d6d-711c-4cd0-8697-634a5c640066 [wins] => 1 [loss] => 6 [winsR] => 2

好吧,这个很复杂。。。假设我有一个名为$data的数组

Array
(
    [9e5b0d6d-711c-4cd0-8697-634a5c640066] => Array
        (
            [player] => 9e5b0d6d-711c-4cd0-8697-634a5c640066
            [wins] => 1
            [loss] => 6
            [winsR] => 2
            [lossR] => 12
        )

    [a8f7fb4c-afab-4ec0-9202-b87fa2641110] => Array
        (
            [player] => a8f7fb4c-afab-4ec0-9202-b87fa2641110
            [wins] => 1
            [loss] => 6
            [winsR] => 2
            [lossR] => 12
        )

    [96ed2f95-08bd-42f8-bb57-9df09b66109d] => Array
        (
            [player] => 96ed2f95-08bd-42f8-bb57-9df09b66109d
            [wins] => 2
            [loss] => 5
            [winsR] => 4
            [lossR] => 10
        )

    [2a4e1a3e-cde4-4c9b-947e-67a4d333f0f4] => Array
        (
            [player] => 2a4e1a3e-cde4-4c9b-947e-67a4d333f0f4
            [wins] => 3
            [loss] => 4
            [winsR] => 6
            [lossR] => 8
        )

    [08c23d63-69a9-4147-b40f-64b241cfbb4f] => Array
        (
            [player] => 08c23d63-69a9-4147-b40f-64b241cfbb4f
            [wins] => 4
            [loss] => 3
            [winsR] => 8
            [lossR] => 6
        )

    [777e8f3e-caac-41fb-975e-a410e42f7114] => Array
        (
            [player] => 777e8f3e-caac-41fb-975e-a410e42f7114
            [wins] => 5
            [loss] => 2
            [winsR] => 11
            [lossR] => 4
        )

    [9cd5256f-6d3a-4bd5-aeed-b6904bcbf048] => Array
        (
            [player] => 9cd5256f-6d3a-4bd5-aeed-b6904bcbf048
            [wins] => 6
            [loss] => 1
            [winsR] => 12
            [lossR] => 3
        )

    [797c95df-c334-4328-a8eb-4ba5e690af4d] => Array
        (
            [player] => 797c95df-c334-4328-a8eb-4ba5e690af4d
            [wins] => 6
            [loss] => 1
            [winsR] => 12
            [lossR] => 2
        )
)
如您所见,我有一系列数据,每个元素都有自己的嵌套数组。我已经知道可以使用单个嵌套值对数组进行排序

usort($data, create_function('$a, $b', 'return $b["wins"] - $a["wins"];')); 
然而,这还不够

问题是,使用上述函数进行排序对我来说不够深入。它所做的只是基于以下内容进行排序:

  • ['wins']递减(最高的wins排在第一位)
我想使用四个嵌套值进行排序

  • ['wins']递减(最高的wins排在第一位)
  • ['loss']升序(最低损失排序秒)
  • ['winsR']递减(最高winsR排序第三)
  • ['lossR']升序(最低lossR排序第四)

我知道这很复杂,所以我来这里寻求帮助。实现这一点的最佳和最有效的方法是什么?

您需要的是函数

在这里,您可以提供自己的比较器,它可以比较两个元素并应用您希望使用的规则

您的思路是正确的,但是您的比较器功能可以更加详细:

function compare_elements($l, $r) {
    if ($l['wins'] > $r['wins']) {
        return -1;
    } else if ($l['wins'] < $r['wins']) {
        return 1;
    }

    // Drop to second level; it will have exited by here
    // if the tie could be broken by the first rule.
    // You really could've put this in an else clause, but I
    // wanted to avoid excessive nesting.
    if ($l['loss'] > $r['loss']) {
        return 1;
    } else if ($l['loss'] < $r['loss']) {
        return -1;
    }

    // And so on until the 4th level    
}
函数比较\u元素($l,$r){
如果($l['wins']>r['wins']){
返回-1;
}否则如果($l['wins']<$r['wins'])){
返回1;
}
//降到第二级;它将在这里退出
//如果第一条规则能打破僵局。
//你真的可以把这个放在另一个条款里,但我
//希望避免过度筑巢。
如果($l['loss']>r['loss']){
返回1;
}否则,如果($l[‘损失’]<$r[‘损失’]){
返回-1;
}
//依此类推,直到第四级
}

您要查找的是函数

在这里,您可以提供自己的比较器,它可以比较两个元素并应用您希望使用的规则

您的思路是正确的,但是您的比较器功能可以更加详细:

function compare_elements($l, $r) {
    if ($l['wins'] > $r['wins']) {
        return -1;
    } else if ($l['wins'] < $r['wins']) {
        return 1;
    }

    // Drop to second level; it will have exited by here
    // if the tie could be broken by the first rule.
    // You really could've put this in an else clause, but I
    // wanted to avoid excessive nesting.
    if ($l['loss'] > $r['loss']) {
        return 1;
    } else if ($l['loss'] < $r['loss']) {
        return -1;
    }

    // And so on until the 4th level    
}
函数比较\u元素($l,$r){
如果($l['wins']>r['wins']){
返回-1;
}否则如果($l['wins']<$r['wins'])){
返回1;
}
//降到第二级;它将在这里退出
//如果第一条规则能打破僵局。
//你真的可以把这个放在另一个条款里,但我
//希望避免过度筑巢。
如果($l['loss']>r['loss']){
返回1;
}否则,如果($l[‘损失’]<$r[‘损失’]){
返回-1;
}
//依此类推,直到第四级
}

Hmm。。。很酷。。。在类环境中如何使用
usort()
?在类环境中,我不能准确地执行
usort($data,$this->compare_elements)
您可能会将其定义为带有static关键字的类作用域函数,并将其称为
MyClass::compare_ranking_array
作为比较器,或者您可以使用匿名函数(请参阅)Hmm。。。很酷。。。在类环境中如何使用
usort()
?在类环境中,我不能准确地执行
usort($data,$this->compare_elements)
您可能会将其定义为带有static关键字的类作用域函数,并将其称为
MyClass::compare_ranking_array
作为比较器,或者您可以使用匿名函数(请参阅)