Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.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_Laravel_Sorting - Fatal编程技术网

php多次排序数组,但保留以前的排序

php多次排序数组,但保留以前的排序,php,laravel,sorting,Php,Laravel,Sorting,所以我需要列出团队的结果,但我需要对它们进行排序。我不能使用SQL(因为每次都需要计算数据)。我目前尝试对数据进行如下排序: usort($result, function($a, $b) { return $a['out_of_time'] - $b['out_of_time'] && $a['tot_controls'] < $b['tot_controls'] && $a['tot_gtks'] < $b['tot_gtks'] &

所以我需要列出团队的结果,但我需要对它们进行排序。我不能使用SQL(因为每次都需要计算数据)。我目前尝试对数据进行如下排序:

usort($result, function($a, $b)
{
    return $a['out_of_time'] - $b['out_of_time'] && $a['tot_controls'] < $b['tot_controls'] && $a['tot_gtks'] < $b['tot_gtks'] && $a['distance'] < $b['distance'];
});
[
    {
        "team_number": 101,
        "pilot": "Robin Tralala",
        "navigator": "Another Person",
        "distance": 0,
        "points_per_gtk": {
            "gtk_1": 2,
            "gtk_2": 2
        },
        "tot_gtks": 4,
        "tot_timecontrols": 2,
        "tot_controls": 20,
        "tot_points": 22,
        "out_of_time": false
    },
    {
        "team_number": 102,
        "pilot": "Bertje Bibber",
        "navigator": "Derp Kwakkel",
        "distance": 0,
        "points_per_gtk": {
            "gtk_1": 4,
            "gtk_2": 1
        },
        "tot_gtks": 5,
        "tot_timecontrols": 1,
        "tot_controls": 0,
        "tot_points": 1,
        "out_of_time": false
    }
]
好的,我需要在
tot\u控件上排序
,然后在
每gtk的点上排序
值,然后在
距离上排序
。我如何在PHP中做到这一点

编辑

我已经写了更多的代码,并且达到了这一点

usort($result, function($a, $b)
{
    $strafpunten = (int)$a['tot_timecontrols'] <=> (int)$b['tot_timecontrols'];

    foreach($a['points_per_gtk'] as $gtk_name => $points)
    {
        $gtk_points = (int)$a['points_per_gtk'][$gtk_name] <=> (int)$b['points_per_gtk'][$gtk_name];

        if($gtk_points)
        {
            return $gtk_points;
        }
    }

    if($strafpunten)
    {
        return $strafpunten;
    }

    return (int)$a['distance'] <=> (int)$b['distance'];
});
usort($result,function($a,$b)
{
$strafpunten=(int)$a['tot_timecontrols'](int)$b['tot_timecontrols'];
foreach($gtk\U name=>$points)作为$gtk\U名称($a['points\u per\u gtk']))
{
$gtk_points=(int)$a['points_per___gtk'][$gtk_name](int)$b['points_per_gtk'][$gtk_name];
如果($gtk_点数)
{
返回$gtk_积分;
}
}
如果($strafpunten)
{
返回$strafpunten;
}
返回值(int)$a['distance'](int)$b['distance'];
});
我真的不知道这种分类是否正确…

不久前,我写道

您可以这样使用它:

<?php
use Stratadox\Sorting\ArraySorter;
use Stratadox\Sorting\Sort;

$table = [
    ['name' => 'Bar', 'rating' => 1],
    ['name' => 'Foo', 'rating' => 3],
    ['name' => 'Baz', 'rating' => 1],
];
$sorter = new ArraySorter();
$table = $sorter->sortThe($table, 
    Sort::descendingBy('rating', Sort::descendingBy('name'))
);

assert($table == [
    ['name' => 'Foo', 'rating' => 3],
    ['name' => 'Baz', 'rating' => 1],
    ['name' => 'Bar', 'rating' => 1],
]);
在需要时将
降序
更改为
升序

您只需使用
composer require stratadox/sorting
安装库即可

编辑:根据此答案下面的注释,似乎需要多维数组支持。这可以通过使用
NestedArraySorter
来实现:

$sorted = (new NestedArraySorter())->sortThe($result, 
    Sort::descendingBy('part_one.total', 
        Sort::descendingBy('part_one.gtk', 
            Sort::descendingBy('part_one.distance')
        )
    )
);

请注意,当使用
NestedArraySorter
时,无法达到包含点的数组偏移量。

因此您需要一个3级数组,对吗?是的,根据我的Json响应,这是正确的。它可能会被制作成一个laravel包吗?因为我安装了它,但我无法使用它,它显示未找到
类阵列排序器
您好!该软件包已经可以与Laravel一起使用,但是您需要使用Stratadox\Sorting\ArraySorter
使用Stratadox\Sorting\Sort在文件的顶部!我会更新一下答案。对于如何使用它的“现实生活”示例,您还可以查看:)如何使用代码对多维数组进行排序?因为我举了一个例子:
$sorted = (new NestedArraySorter())->sortThe($result, 
    Sort::descendingBy('part_one.total', 
        Sort::descendingBy('part_one.gtk', 
            Sort::descendingBy('part_one.distance')
        )
    )
);