PHP仅用于排名的逻辑

时间:2016-08-02 11:37:25

标签: php ranking

我正在尝试使用PHP开发一个排名函数(没有MySQL),它也可以处理重复值。

示例,在下面的数组中,我们有经理和他们管理的商店数量:

 $manag = array(
      [0] => array(
           'manager' => 'David',
           'stores' => '20'
      ),
      [1] => array(
           'manager' => 'John',
           'stores' => '12'
      ),
      [2] => array(
           'manager' => 'Tony',
           'stores' => '37'
      ),
      [3] => array(
           'manager' => 'Batman',
           'stores' => '49'
      ),
      [4] => array(
           'manager' => 'Barbie',
           'stores' => '37'
      )
 );

现在我想根据他们拥有的商店数量和经理人数量对经理人进行排名,同时考虑到可能有多个经理人拥有相同数量的商店。示例输出:

 array(
      ['Batman'] => 1,
      ['Tony']   => 3,
      ['Barbie'] => 3,
      ['David']  => 4,
      ['John']   => 5
 );

请注意,排名必须始终达到管理者的数量,在这种情况下,5。还要注意,当我们有重复的商店数量值时,管理者排名最低(排名3)而不是排名2,如如果他们必须争取第二名。

最好的方法是什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

请试试这个

$jitendra = array();

foreach ($manag as $key => $row)
{
    $jitendra[$key] = $row['stores'];
}
array_multisort($jitendra, SORT_DESC, $manag);

答案 1 :(得分:1)

function sort_managers($a,$b){
    if($a['stores'] == $b['stores'])
        return 0;
    return ($a['stores']>$b['stores'])? -1:1;
}

usort($manag,'sort_managers');


function place_rank(&$item,$key,$stores){
    $item['rank']   =   count($stores) - array_search($item['stores'],array_reverse($stores)) - 1;
}
$stores =   array_column($manag,'stores');
array_walk($manag, 'place_rank',$stores);