php多次排序数组,但保留以前的排序
所以我需要列出团队的结果,但我需要对它们进行排序。我不能使用SQL(因为每次都需要计算数据)。我目前尝试对数据进行如下排序: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'] &
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')
)
)
);