首页 > 解决方案 > 对数组进行两次排序或使用 php 微调数组

问题描述

假设我有一个足球联赛数组:

  $array = [
    'teamId1' => 
    [
         'games' => 7,
         'wins' => 2,
         'loss' => 4,
         'duals' => 1,
         'point' => 7
    ],
    'teamId2' => 
    [
         'games' => 7,
         'wins' => 3,
         'loss' => 1,
         'duals' => 3,
         'point' => 12
    ],
    'teamId3' => 
    [
         'games' => 7,
         'wins' => 4,
         'loss' => 3,
         'duals' => 0,
         'point' => 12
    ],
    'teamId4' => 
    [
         'games' => 7,
         'wins' => 6,
         'loss' => 0,
         'duals' => 1,
         'point' => 19
    ],
    'teamId5' => 
    [
         'games' => 7,
         'wins' => 3,
         'loss' => 2,
         'duals' => 2,
         'point' => 11
    ],
.
.
.
    'teamId18' => 
    [
         'games' => 7,
         'wins' => 5,
         'loss' => 0,
         'duals' => 2,
         'point' => 17
    ],
 ];

我想对此进行排序By POINT DESC;所以我确实使用这个函数来按点对我的数组进行排序:

function sortArray($array, $on, $order=SORT_ASC)
{

    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0)
    {
        foreach ($array as $k => $v)
        {
            if (is_array($v))
            {
                foreach ($v as $k2 => $v2)
                {
                    if ($k2 == $on)
                    {
                        $sortable_array[$k] = $v2;
                    }
                }
            }
            else
            {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
                break;
            case SORT_DESC:
                arsort($sortable_array);
                break;
        }

        foreach ($sortable_array as $k => $v)
        {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$sortByPoint = sortArray($result, 'point', SORT_DESC);

好的,现在我有一个按点排序的数组,但是现在我需要像fine tune我的数组这样的东西来重新排序数组when two-or more- teams have same point, the team/s with more wins come before other

我知道我可以遍历排序数组并做一些事情,但我确信有更短和更棘手的方法可以做到这一点。

有人对此有任何想法吗?

提前致谢

标签: phparrayssorting

解决方案


为此编写特定的排序会更容易。使用usort(),您可以在一个简单的函数中根据需要为条件添加复杂层...

usort($array, function ($a, $b) {
    if ( $a['point'] == $b['point'] ){
        // Sort by wins (descending)
        return $b['wins'] - $a['wins'];
    }
    // Sort by points descending
    return  $b['point'] - $a['point'] ;
});

print_r($array);

这会对实际数组进行排序,因此 output $array

您可以通过说是否相同的获胜次数、按损失排序等来进一步扩展它。


推荐阅读