如何按多个属性对ID进行排序



我有一个具有3个属性的击剑运动员id的多维数组(见下面的代码(

Array
(
[0] => Array
(
[id] => 5255
[ratio] => 1
[point_difference] => -25
[given] => 0
)
[1] => Array
(
[id] => 12256
[ratio] => 0.5
[point_difference] => -6
[given] => 15
)
[2] => Array
(
[id] => 3473
[ratio] => 0.83333333333333
[point_difference] => -26
[given] => 4
)
[3] => Array
(
[id] => 10478
[ratio] => 0.16666666666667
[point_difference] => -16
[given] => 12
)
[4] => Array
(
[id] => 10256
[ratio] => 0
[point_difference] => -15
[given] => 10
)
)

我想先按比例,然后按点差,再给定对击剑运动员进行排序

我尝试了array_columns的多端口,但它混淆了列阵列的键,我需要这些键作为击剑运动员的ID,这样我就可以用排名更新数据库。($ARRAY_fencers是上面看到的多维的名称(

//define columns
$ratio_column = array_column($ARRAY_fencers, "ratio", "id");
$point_diff_column = array_column($ARRAY_fencers, "point_difference", "id");
$given_points_column = array_column($ARRAY_fencers, "given", "id");
//start sorting the array array
if (!array_multisort($ratio_column, SORT_DESC, SORT_NUMERIC, $point_diff_column, SORT_DESC, SORT_NUMERIC, $given_points_column, SORT_DESC, SORT_NUMERIC, $ARRAY_fencers)) {
echo "CRITICAL ERROR: array_multisort could not complete the sort!";
} 

如果我试图在排序后获得列的键,我只得到0、1、2。。。不是ID,但如果我在排序之前这样做,我会得到ID,而且很完美,但显然不是按顺序。

我的目标是获取其中一列的键,并使用该数组更新数据库。

//update competitors temp ranking
$temp_ranking_array = array_keys($given_points_column);

是我做错了什么,还是应该用别的东西?

谢谢你的回答!

在排序之前,您不需要在三个array_column使用中按id进行索引,正如您所看到的,它们无论如何都会在排序之后重新索引。

关联(字符串(键将被保留,但数字键将被重新索引

所以排序后只需执行:

$ARRAY_fencers = array_column($ARRAY_fencers, null, "id");

要获得密钥,你可以在不知道它是密钥的情况下使用第一个项目,或者按照你目前的方式进行:

$temp_ranking_array = array_keys(reset($ARRAY_fencers));

我不会创建新的变量,除非我出于另一个原因需要它们:

array_multisort(array_column($ARRAY_fencers, "ratio"), SORT_DESC, SORT_NUMERIC,
array_column($ARRAY_fencers, "point_difference"), SORT_DESC, SORT_NUMERIC,
array_column($ARRAY_fencers, "given"), SORT_DESC, SORT_NUMERIC,
$ARRAY_fencers);
$ratio = [];
$point_difference = [];
$given = [];
foreach($arr as $a){
$ratio[] = array('id'=>$a['id'],'value'=>$a['ratio']);
$point_difference[] = array('id'=>$a['id'],'value'=>$a['point_difference']);
$given[] = array('id'=>$a['id'],'value'=>$a['given']);
}
usort($ratio,"sort_multi");
usort($point_difference,"sort_multi");
usort($given,"sort_multi");
function sort_multi($a, $b){
if($a['value'] == $b['value']) return 0;
return ($a['value']<$b['value'])?-1:1;
}

最新更新