2012-12-05 205 views
0

我有以下数组,我想按总数降序排列所有记录。任何人都可以告诉我这样做的PHP代码或伪代码。使用索引对多维数组排序多维数组

Array 
(
    [reg_id] => Array 
     (
      [0] => 5 
      [1] => 7 
      [2] => 17 
      [3] => 18 
      [4] => 19 
      [5] => 20 
      [6] => 34 
     ) 

    [name] => Array 
     (
      [0] => employee1 
      [1] => employee6 
      [2] => employee3 
      [3] => employee4 
      [4] => employee2 
      [5] => empoyee5 
      [6] => employee9 
     ) 

    [test_w] => Array 
     (
      [0] => 21/30 
      [1] => 15/30 
      [2] => 27/30 
      [3] => 16.5/30 
      [4] => 21/30 
      [5] => 18/30 
      [6] => 12/30 
     ) 

    [intr_w] => Array 
     (
      [0] => 8/10 
      [1] => 6/10 
      [2] => 9/10 
      [3] => 9/10 
      [4] => 3.3/10 
      [5] => 7/10 
      [6] => 0/10 
     ) 

    [exp_w] => Array 
     (
      [0] => 2.5/5 
      [1] => 4/5 
      [2] => 4.35/5 
      [3] => 4.5/5 
      [4] => 4.8/5 
      [5] => 4.5/5 
      [6] => 0/5 
     ) 

    [educ_w] => Array 
     (
      [0] => 37.41/55 
      [1] => 44.14/55 
      [2] => 33.27/55 
      [3] => 38.43/55 
      [4] => 34.52/55 
      [5] => 46.11/55 
      [6] => 43.66/55 
     ) 

    [total] => Array 
     (
      [0] => 68.91 
      [1] => 69.14 
      [2] => 73.62 
      [3] => 68.43 
      [4] => 63.62 
      [5] => 75.61 
      [6] => 55.66 
     ) 

) 
+0

[array_multisort()](http://php.net/manual/en/array.sorting.php)? – GolezTrol

+0

你会把这个数组变成一维数组吗? –

+0

不,怎么做? –

回答

1

使用该函数应该解决的问题

function multisort($array, $key, $sort_flags = SORT_REGULAR) { 
     if (is_array($array) && count($array) > 0) { 
      if (!empty($key)) { 
       $mapping = array(); 
       foreach ($array as $k => $v) { 
        $sort_key = ''; 
        if (!is_array($key)) { 
         $sort_key = $v[$key]; 
        } else { 
         // @TODO This should be fixed, now it will be sorted as string 
         foreach ($key as $key_key) { 
          $sort_key .= $v[$key_key]; 
         } 
         $sort_flags = SORT_STRING; 
        } 
        $mapping[$k] = $sort_key; 
       } 
       asort($mapping, $sort_flags); 
       $sorted = array(); 
       foreach ($mapping as $k => $v) { 
        $sorted[] = $array[$k]; 
       } 
       return $sorted; 
      } 
     } 
     return $array;  

} 

例如:

$result=multisort($array,$sort_flags = DESC); 
1

最简单的(但至少有效)将是一个简单的冒泡排序

伪代码

for($i from 0 to count($arr[total])): 
     for($j from 0 to count(...)): 
      if($arr[total][$i] < $arr[total][$j]): 
        //SWAP VALUES AT i AND j 
        $this->swap($arr[total][$i],$arr[total][$j]); 
        $this->swap($arr[name][$i],$arr[name][$j]); 
        $this->swap($arr[reg_id][$i],$arr[reg_id][$j]); 
        // etc for all required fields 
      endif; 
     endfor; 
endfor; 

交换功能(PASS珍视参考,因此,他们将得到改变)

function swap(&$i, &$j){ 
    $t=$i; 
    $i=$j; 
    $j=$t; 
} 
+0

你能否解释一下术语将所有字段替换为我的情况。我坚持这一点。 –

+0

我编辑了上面的答案。它现在包含你如何交换。再次,这可以用于任何排序算法,不仅是Bubble排序 – cjds

0

由于这些似乎是与实体相关的领域,最好的答案我可以给你是为了建立更好的数据结构。举例,你应该建立包含这些领域的员工(或任何实体您代表那里)类:

class Employee 
{ 
public $reg_id; 
public $name; 
public $test_w; 
public $intr_w; 
public $exp_w; 
public $educ_w; 
public $total; 
} 

,然后保持员工的数组。如果你有另一个领域又是一个数组呢?我知道我的答案没有解决实际的分类问题,我只是说你保持数据的方式非常快速。

0

我有以下功能排序数组。

function msort($array, $key_s) { 
    $arraynew = $array; 
    foreach($array as $key=>$val){ 
     if($key == $key_s){ 

      for($i=0; $i<count($val); $i++){ 
       for($j=0; $j<count($val); $j++){ 
        if($val[$i] > $val[$j]){ 
         $temp = $val[$i]; 
         $val[$i] = $val[$j]; 
         $val[$j] = $temp; 

         // swap all values 
         foreach($arraynew as $arrKey=>$arrVal){ 
          $temp = $arraynew[$arrKey][$i]; 
          $arraynew[$arrKey][$i] = $arraynew[$arrKey][$j]; 
          $arraynew[$arrKey][$j] = $temp; 
         } 
        } 
       } 
      } 
     } 

    } 
    return $arraynew; 
}