2016-09-27 46 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