0

我有一个具有 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
        )
)

我想按比率对击剑手进行排序,然后给定point_difference

我尝试使用 array_columns 进行 multisport,但它弄乱了列数组的键,我需要将键作为击剑手的 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);

我做错了什么还是应该使用其他东西?

感谢您的回答!

4

2 回答 2

0

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

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

所以在排序之后做:

$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);
于 2021-01-05T21:15:22.577 回答
-1
$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;
}
于 2021-01-05T22:25:20.647 回答