2016-09-27 40 views
0

我有兩個陣列在PHP,$array1$array2,我基於$array1爲了排名兩個陣列基於花葯陣列上

$array1 =array(2,10,4,5,2,1); 
$array2 =array(A,B,C,D,E,F); 



    $ordered_values = $array1; 
    array_multisort($array1, $array2); 

    foreach ($array1 as $key => $value) { 
    foreach ($ordered_values as $ordered_key => $ordered_value) { 
     if ($value === $ordered_value) { 
     $key = $ordered_key; 
     break; 
    } 
    } 


    echo $value . '- Rank: ' . ((int) $key + 1) . '<br/>'; 

    } 

排名$array2上面給出這導致

1- Rank: 6 
    2- Rank: 1 
    2- Rank: 1 
    4- Rank: 3 
    5- Rank: 4 
    10-Rank: 2 

然而這是我期待的

B- Rank: 1 
    D- Rank: 2 
    C- Rank: 3 
    E- Rank: 4 
    A- Rank: 4 
    F- Rank: 6 

任何幫助表示讚賞。

回答

2

您可以將array_combine這兩個數組排列在一起,並按arsort按值排序並保留關聯鍵。在循環之前設置等級號的計數器。還添加了一個臨時保持在以前的值來檢查,如果我們想使排序號碼靜止不動和多少跳過完成另一個容器:

$array3 = array_combine($array2, $array1); arsort($array3); 
$skip = 0; $i = 0; $temp = null; 
foreach($array3 as $k => $v) { 
    if($temp !== $v) {$i++; $i += $skip; $skip = 0;}else {$skip++;} 
    $temp = $v; 
    echo $k, ' Rank: ', $i, "\n"; 

} 

if條件以上只是檢查,如果以前的值是不等於。如果沒有,只需繼續增量。如果它等於加上跳過計數器。然後,一旦迭代在不相等時重新開始,這會將跳過計數器合併到當前的等級號碼。

Sample Output

+0

感謝洙多爲你的,它的實際工作 – MessiahCoder

+0

@MessiahCoder真高興這有助於 – Ghost

+0

我問這在MySQL中也有類似的陣列數據的問題,我想找到從MySQL排名使用FIND_IN_SET功能或任何其他更好的功能,請看看這個問題,如果你可以幫助http://stackoverflow.com/q/39730507/6855079 – MessiahCoder