如何按多个属性对 ID 进行排序
How can I sort IDs by multiple attributes
我有一个包含 3 个属性的 fencer 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
)
)
我想按比例对击剑手进行排序,然后 point_difference 然后给定
我尝试使用 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
建立索引,而且如您所见,无论如何它们都会在排序后重新建立索引。
Associative (string) keys will be maintained, but numeric keys will be re-indexed.
所以在排序之后就做:
$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;
}
我有一个包含 3 个属性的 fencer 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
)
)
我想按比例对击剑手进行排序,然后 point_difference 然后给定
我尝试使用 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
建立索引,而且如您所见,无论如何它们都会在排序后重新建立索引。
Associative (string) keys will be maintained, but numeric keys will be re-indexed.
所以在排序之后就做:
$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;
}