2016-08-02 79 views
-1

我想開發一個排名函數只有PHP(沒有MySQL),它也可以處理重複的值。PHP只爲邏輯排名

例如,陣列下面我們就管理者和他們有多少門店管理上:

$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,好像他們必須爭取第二名。

什麼是最好的方法來解決這個問題?

在此先感謝。

回答

1

請試試這個

$jitendra = array(); 

foreach ($manag as $key => $row) 
{ 
    $jitendra[$key] = $row['stores']; 
} 
array_multisort($jitendra, SORT_DESC, $manag); 
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); 
+0

歡迎您,這個功能比循環更快。 – Mickey

+0

@dzerow,我修改了代碼,檢查它是否適用於您 – Mickey