php数组排序

php数组排序已经有很多函数,但是还是没办法满足我的要求,只好自己上手了,由于匆忙,没有优化,不过好在功能实现了。

我的需求是啥呢?具体是这样的,我有一个投票排行数组,大概长得这样

$arr = array(1824 => 10, 2096 => 5, 3233 => 7, 4442 => 5, 1154 => 10, 1024 => 10, 1102 => 5);

键是投票id号,值是票数,要进行排行,我直接arsort,出来这样:

Array
(
    [1824] => 10
    [1154] => 10
    [1024] => 10
    [3233] => 7
    [2096] => 5
    [4442] => 5
    [1102] => 5
)

票数倒是按照大小来排了,但是值相同的键是乱的。一查文档,果然是php实现的问题,还有一个stable_ursort函数,那个就不贴了,反正出来的结果不对。自己写了一个

function csort($arr){
    arsort($arr);
    $sortarr = array();
    $sortedarr = array();
    $val = 0;
    $i = 1;
    foreach ($arr as $a => $r) {
      if($i == 1){
        $sortarr[$a] = $r;
        $val = $r;
      }else{
        if($r != $val){
          if(count($sortarr) > 1){
            ksort($sortarr);
            $sortedarr = $sortedarr + $sortarr;
            $sortarr = array();
          }elseif(count($sortarr) == 1){
            $sortedarr = $sortedarr + $sortarr;
            $sortarr = array();
          }
          $sortarr[$a] = $r;
          $val = $r;
        }else{
          $sortarr[$a] = $r;
        }
      }
      if($i == count($arr)){
        if(count($sortarr) > 1){
          ksort($sortarr);
          $sortedarr = $sortedarr + $sortarr;
          $sortarr = array();
        }elseif(count($sortarr) == 1){
          $sortedarr = $sortedarr + $sortarr;
          $sortarr = array();
        }
      }
      $i++;
    }
    return $sortedarr;
  }

输出结果终于跟我想要的一样了

Array
(
    [1024] => 10
    [1154] => 10
    [1824] => 10
    [3233] => 7
    [1102] => 5
    [2096] => 5
    [4442] => 5
)

票数按照倒叙排行,相同票数按照序号进行正序排行。