基于花药数组按顺序排列两个数组

时间:2016-09-27 00:04:06

标签: php arrays

我在php中有两个数组,$array1$array2,我根据$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/>';

  }

上面给出了这个结果

   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

感谢任何帮助。

1 个答案:

答案 0 :(得分: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