Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅用于排序的PHP逻辑_Php_Ranking - Fatal编程技术网

仅用于排序的PHP逻辑

仅用于排序的PHP逻辑,php,ranking,Php,Ranking,我正在尝试开发一个仅使用PHP(无MySQL)的排名函数,它还可以处理重复值 例如,在下面的阵列中,我们有经理以及他们管理的门店数量: $manag = array( [0] => array( 'manager' => 'David', 'stores' => '20' ), [1] => array( 'manager' => 'John',

我正在尝试开发一个仅使用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,就好像他们必须争夺第二名一样

最好的方法是什么

提前谢谢。

请试试这个

$jitendra = array();

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

不客气,这个函数比循环快。@dzerow,我已经修改了代码,请检查它是否适合您
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);