如何按多个属性对 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;
}