PHP多維陣列指定多欄位排序的樣本

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP多維陣列指定多欄位排序的樣本,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

介紹array_multisort方法

array_multisort — 對多個數組或多維陣列進行排序.其php 手冊中的說明如下:

複製代碼 代碼如下:

bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )

參數

arr
要排序的一個 array。

arg
接下來的每個參數可以是另一個 array 或者是為之前 array 排序標誌選項參數: SORT_ASC, SORT_DESC,SORT_REGULAR, SORT_NUMERIC, SORT_STRING.

Additional arg's.

先實現指定多維陣列一個欄位排序

此處要求根據其中的一個欄位來對數組進行排序,數組假設如下:

  $array = array(      0=>array('id'=>8,'name'=>'Tom'),      1=>array('id'=>9,'name'=>'Peter'),      2=>array('id'=>5,'name'=>'Jack')  );

我們要根據二維數組的id值來排序,轉換後的數組格式如下:

  $array = array(      0=>array('id'=>5,'name'=>'Jack')      1=>array('id'=>8,'name'=>'Tom'),      2=>array('id'=>9,'name'=>'Peter')  );

要完成上述的轉換,需要用到上面介紹的array_multisort函數,如下:

  function sortArrByOneField(&$array, $field, $desc = false){    $fieldArr = array();    foreach ($array as $k => $v) {     $fieldArr[$k] = $v[$field];    }    $sort = $desc == false ? SORT_ASC : SORT_DESC;    array_multisort($fieldArr, $sort, $array);  }

通過將待排序數組的各個數組的$field儲存在一位元組fieldArr中,在傳入array_multisort中參與排序。其中field數組的值如下:

array(0=>8,1=>9,2=>5)

傳入 array_multisort後,相當於對$field一維數組的排序,而後根據排序後的key重新構建傳入的待排序數組。

實現多維陣列的指定多個欄位排序

上面的執行個體講解了如何?多維陣列指定一個欄位排序,但如果要實現指定多個欄位來對數組進行排序該如何思考?
多個欄位是幾個?2個,3個或更多,所以這個不確定的因素需要排除。

我們先來看2指定2個欄位進行排序的方案:

  $arr = array(    '0' => array(      'id' => 3,      'age' => 27     ),    '1' => array(      'id' => 5,      'age' => 50    ),    '2' => array(      'id' => 4,      'age' => 44    ),    '3' => array(      'id' => 3,      'age' => 78    )   );  foreach ( $arr as $key => $row ){    $id[$key] = $row ['id'];    $age[$key] = $row ['age'];  }  array_multisort($id, SORT_ASC, $age, SORT_DESC, $arr);  print_r($arr);  //result:Array([0]=>Array(['id']=>3 ['age']=>78) [1]=>Array(['id']=>3 ['age']=>27) [2]=>Array(['id']=>4 ['age']=>44) [3]=>Array(['id']=>5 ['age']=>50))

重構上述代碼,只要採用php中的func_get_args函數,來動態擷取傳入的值,既可以解決多欄位個數不確定的問題。實現如下:

  $array1 = array(        0=>array('id'=>8,'name'=>'Apple','age'=> 18),        1=>array('id'=>8,'name'=>'Bed','age'=>17),        2=>array('id'=>5,'name'=>'Cos','age'=>16),        3=>array('id'=>5,'name'=>'Cos','age'=>14)  );  function sortArrByManyField(){    $args = func_get_args();    if(empty($args)){      return null;    }    $arr = array_shift($args);    if(!is_array($arr)){      throw new Exception("第一個參數不為數組");    }    foreach($args as $key => $field){      if(is_string($field)){        $temp = array();        foreach($arr as $index=> $val){          $temp[$index] = $val[$field];        }        $args[$key] = $temp;      }    }    $args[] = &$arr;//引用值    call_user_func_array('array_multisort',$args);    return array_pop($args);  }  $arr = sortArrByManyField($array1,'id',SORT_ASC,'name',SORT_ASC,'age',SORT_DESC);  print_r($arr);

運行結果如下:

    array(4) {      [0]=>array(3) {            ["id"]=>int(5)            ["name"]=>string(3) "Cos"            ["age"]=>int(16)          }      [1]=>array(3) {            ["id"]=>int(5)            ["name"]=>string(3) "Cos"            ["age"]=>int(14)          }      [2]=>array(3) {            ["id"]=>int(8)            ["name"]=>string(5) "Apple"            ["age"]=>int(18)          }      [3]=>array(3) {            ["id"]=>int(8)            ["name"]=>string(3) "Bed"            ["age"]=>int(17)      }    }

以上就是本篇文章的全部內容了,感謝大家閱讀。更多請關注topic.alibabacloud.com!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.