php mysql 排序規則_php 數組排序以及按照某個字段排序

如果你已經使用了一段時間PHP的話,那么,你應該已經對它的數組比較熟悉了——這種數據結構允許你在單個變量中存儲多個值,并且可以把它們作為一個集合進行操作。

經常,開發人員發現在PHP中使用這種數據結構對值或者數組元素進行排序非常有用。PHP提供了一些適合多種數組的排序函數,這些函數允許你在數組內部對元素進行排列,也允許用很多不同的方法對它們進行重新排序。在這篇文章中我們將討論該排序中最重要的幾個函數。

簡單排序

首先,讓我們來看看最簡單的情況:將一個數組元素從低到高進行簡單排序,這個函數既可以按數字大小排列也可以按字母順序排列。PHP的sort()函數實現了這個功能,如Listing A所示:

Listing A

? $data = array(5,8,1,7,2);

? sort($data);

? print_r($data);

? ?>

輸出結果如下所示:

Array ([0] => 1

[1] => 2

[2] => 5

[3] => 7

[4] => 8

)

也能使用rsort()函數進行排序,它的結果與前面所使用的sort()簡單排序結果相反。Rsort()函數對數組元素進行從高到低的倒排,同樣可以按數字大小排列也可以按字母順序排列。Listing B給我們展示了它的一個例子:

Listing B

?>

它的輸出結果如下:

Array ([0] => 8

[1] => 7

[2] => 5

[3] => 2

[4] => 1

)

根據關鍵字排序

當我們使用數組的時候,經常根據關鍵字對數組重新排序,從高到低。Ksort()函數就是根據關鍵字進行排序的函數,同時,它在排序的過程中會保持關鍵字的相關性。Listing C就是一個例子:

Listing C

<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");ksort($data); print_r($data);

?>

它的輸出結果如下:

Array ([DE] => Germany

[ES] => Spain

[IN] => India

[US] => United States

)

Krsort()函數是根據關鍵字對數組進行倒排,Listing D就是這樣的例子:

Listing D

<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");krsort($data); print_r($data);

?>

它的輸出結果如下:

Array ([US] => United States

[IN] => India

[ES] => Spain

[DE] => Germany

)

根據值排序

如果你想使用值排序來取代關鍵字排序的話,PHP也能滿足你的要求。你只要使用asort()函數來代替先前提到的ksort()函數就可以了。如Listing E所示:

Listing E

<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");asort($data); print_r($data);

?>

下面就是它的輸出結果。請注意這個結果與上面使用ksort()函數所得到的結果的不同——在這兩種情況中,都是按字母順序進行排序的,但是它們是根據數組的不同字段進行排序的。

同時,請注意關鍵字-值之間的聯系會始終保持;它只是關鍵字-值對排序后的一種方式,排序并不會改變它們的對應關系。

Array ([DE] => Germany

[IN] => India

[ES] => Spain

[US] => United States

)

現在,你肯定能猜到這種排序也可以進行倒排,它使用arsort()函數完成這個功能。Listing F就是一個例子:

Listing F

<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");arsort($data); print_r($data);

?>

下面是它的輸出結果,根據值按字母表順序進行倒排。將下面的結果與用krsort()函數進行倒排后生成的結果進行比較,就能很容易明白兩者的不同了。

Array ([US] => United States

[ES] => Spain

[IN] => India

[DE] => Germany

)

自然語言排序

PHP有一個非常獨特的排序方式,這種方式使用認知而不是使用計算規則。這種特性稱為自然語言排序,當創建模糊邏輯應用軟件的時候這種排序方式非常有用。下面大家可以來看看它的一個簡單例子,如Listing G所示:

Listing G

natsort($data); print_r($data);?>

它的輸出結果如下:

Array ([0] => book-1

[1] => book-10

[2] => book-100

[3] => book-5

)

Array

(

[0] => book-1

[3] => book-5

[1] => book-10

[2] => book-100

)

它們的不同已經很清楚了:第二個排序結果更直觀,更“人性化”,然而第一個則更符合算法規則,更具“計算機”特點。

自然語言能進行倒排嗎?答案是肯定的!只要對natsort()的結果使用array_reverse()函數就可以了,Listing H就是一個簡單例子:

Listing H

?>

下面是它的輸出結果:

Array ([0] => book-100

[1] => book-10

[2] => book-5

[3] => book-1

)

根據用戶自定義的規則排序

PHP也能讓你定義自己的排序算法,你可以通過創建你自己的比較函數,并把它傳遞給usort()函數。如果第一個參數比第二個參數“小”的話,比較函數必須返回一個比0小的數,如果第一參數比第二個參數“大”的話,比較函數應該返回一個比0大的數。

Listing I就是這樣的一個例子,在這個例子中根據它們的長度對數組元素進行排序,最短的項放在最前面:

Listing I

print_r($data); function sortByLen($a, $b) {

if (strlen($a) == strlen($b)) {

return 0;

} else {

return (strlen($a) > strlen($b)) ? 1 : -1;

}

}

?>

這樣,就創建了我們自己的比較函數,這個函數使用strlen()函數比較每一個字符串的個數,然后分別返回1,0或-1.這個返回值是決定元素排列的基礎。下面是它的輸出結果:

Array ([0] => jay@zoo.tw

[1] => joe@host.com

[2] => john.doe@gh.co.uk

[3] => asmithsonian@us.info

)

自然語言排序

PHP有一個非常獨特的排序方式,這種方式使用認知而不是使用計算規則。這種特性稱為自然語言排序,當創建模糊邏輯應用軟件的時候這種排序方式非常有用。下面大家可以來看看它的一個簡單例子,如Listing G所示:

Listing G

natsort($data); print_r($data);?>

它的輸出結果如下:

Array ([0] => book-1

[1] => book-10

[2] => book-100

[3] => book-5

)

Array

(

[0] => book-1

[3] => book-5

[1] => book-10

[2] => book-100

)

它們的不同已經很清楚了:第二個排序結果更直觀,更“人性化”,然而第一個則更符合算法規則,更具“計算機”特點。

自然語言能進行倒排嗎?答案是肯定的!只要對natsort()的結果使用array_reverse()函數就可以了,Listing H就是一個簡單例子:

Listing H

?>

下面是它的輸出結果:

Array ([0] => book-100

[1] => book-10

[2] => book-5

[3] => book-1

)

根據用戶自定義的規則排序

PHP也能讓你定義自己的排序算法,你可以通過創建你自己的比較函數,并把它傳遞給usort()函數。如果第一個參數比第二個參數“小”的話,比較函數必須返回一個比0小的數,如果第一參數比第二個參數“大”的話,比較函數應該返回一個比0大的數。

Listing I就是這樣的一個例子,在這個例子中根據它們的長度對數組元素進行排序,最短的項放在最前面:

Listing I

print_r($data); function sortByLen($a, $b) {

if (strlen($a) == strlen($b)) {

return 0;

} else {

return (strlen($a) > strlen($b)) ? 1 : -1;

}

}

?>

這樣,就創建了我們自己的比較函數,這個函數使用strlen()函數比較每一個字符串的個數,然后分別返回1,0或-1.這個返回值是決定元素排列的基礎。下面是它的輸出結果:

Array ([0] => jay@zoo.tw

[1] => joe@host.com

[2] => john.doe@gh.co.uk

[3] => asmithsonian@us.info

)

多維排序

最后,PHP也允許在多維數組上執行一些比較復雜的排序——例如,首先對一個嵌套數組使用一個普通的關鍵字進行排序,然后再根據另一個關鍵字進行排序。這與使用SQL的ORDER BY語句對多個字段進行排序非常相似。為了能更好的明白它是如何工作的,請仔細看Listing J所舉的例子:

Listing J

<?php $data = array(array("id" => 1, "name" => "Boney M", "rating" => 3),

array("id" => 2, "name" => "Take That", "rating" => 1),

array("id" => 3, "name" => "The Killers", "rating" => 4),

array("id" => 4, "name" => "Lusain", "rating" => 3),

); foreach ($data as $key => $value) {

$name[$key] = $value['name'];

$rating[$key] = $value['rating'];

}

array_multisort($rating, $name, $data); print_r($data);?>

這里,我們在$data數組中模擬了一個行和列數組。然后,我使用array_multisort()函數對數據集合進行重排,首先是根據rating進行排序,然后,如果rating相等的話,再根據name排序。它的輸出結果如下:

Array ([0] => Array

(

[id] => 2

[name] => Take That

[rating] => 1

) [1] => Array

(

[id] => 1

[name] => Boney M

[rating] => 3

)

[2] => Array

(

[id] => 4

[name] => Lusain

[rating] => 3

)

[3] => Array

(

[id] => 3

[name] => The Killers

[rating] => 4

)

)

array_multisort()函數是PHP中最有用的函數之一,它有非常廣泛的應用范圍。另外,就如你在例子中所看到的,它能對多個不相關的數組進行排序,也可以使用其中的一個元素作為下次排序的基礎,還可以對數據庫結果集進行排序。

這些例子應該讓你對PHP中各種數組排序函數的使用有了初步的了解,也向你展示了一些隱藏在PHP數組處理工具包的內部功能。

下面是對二位數組中的某個字段進行排序的兩種方式方法:

PHP對數組的某個字段排序方法1

private function arrCmp($a,$b){

if($a['day_time'] == $b['day_time']){

return 0;

}

return($a['day_time']

}

使用方法:

usort($new, array("DeveloperController", "arrCmp"));

數組原型:

Array ([0] => Array ( [day_time] => 1291161600 [one_sum_click_num] => 2 [two_sum_click_num] => 2 )[1] => Array ( [day_time] => 1291248000 [one_sum_click_num] => 7 [two_sum_click_num] => 5 )[2] => Array ( [day_time] => 1291334400 [one_sum_click_num] => 4 )[3] => Array ( [day_time] => 1291593600 [two_sum_click_num] => 2 ) ) )這樣子根據其數組中的 day_time字段進行排序。下面是摘自php 手冊上的說明。對數據庫結果進行排序 方法2

本例中 data 數組中的每個單元表示一個表中的一行。這是典型的數據庫記錄的數據集合。

例子中的數據如下:

volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7數據全都存放在名為 data 的數組中。這通常是通過循環從數據庫取得的結果,例如 mysql_fetch_assoc()。

$data[]?=?array('volume'=>67,'edition'=>2);$data[]?=?array('volume'=>86,'edition'=>1);$data[]?=?array('volume'=>85,'edition'=>6);$data[]?=?array('volume'=>98,'edition'=>2);$data[]?=?array('volume'=>86,'edition'=>6);$data[]?=?array('volume'=>67,'edition'=>7);?>本例中將把 volume 降序排列,把 edition 升序排列。

現在有了包含有行的數組,但是 array_multisort() 需要一個包含列的數組,因此用以下代碼來取得列,然后排序。

<?php //?取得列的列表foreach?($dataas$key=>$row)?{$volume[$key]?=$row['volume'];$edition[$key]?=$row['edition'];

}//?將數據根據?volume?降序排列,根據?edition?升序排列

//?把?$data?作為最后一個參數,以通用鍵排序array_multisort($volume,SORT_DESC,$edition,SORT_ASC,$data);?>數據集合現在排好序了,結果如下:

volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單例問題與線程安全

餓漢式 沒有線程安全性問題 懶漢式 public class SingletonDemo2 {private static SingletonDemo2 instance;private SingletonDemo2() {}public static SingletonDemo2 getInstance() {if(instancenull) {instancenew SingletonDemo2();}return instance;}}如果遇到多線程。上…

python 音速_中國大學MOOC的APP(慕課)2021用Python玩轉數據章節答案

在高技術戰爭件下,信息的獲取相當于人的感覺器官,信息的傳輸相當于人的神經網絡,信息的處理相當于人的大腦,( )則將它們聯系為一個整體,構成了作戰的神經系統。車身可拆卸的連接有螺紋連接、卡口鏈接、鉸鏈連接。在高技術戰爭件下,信息的獲取相當于人的感覺器官,信息的傳輸相當…

Mysql中的觸發器

原文地址&#xff1a;https://www.cnblogs.com/zyshi/p/6618839.html ---------------------------------------------------------什么是觸發器 簡單的說&#xff0c;就是一張表發生了某件事&#xff08;插入、刪除、更新操作&#xff09;&#xff0c;然后自動觸發了預先編寫好…

一張圖理解JS的原型(prototype、_proto_、constructor的三角關系)

注意&#xff1a;前方高能預警&#xff0c;請認真仔細看完&#xff0c;閱讀完后自己再次畫下原型圖&#xff0c;相信你一定會有更深刻的認識。(推薦炒雞好用的畫流程圖的軟件ProcessOn)構造函數&#xff1a;function Foo ( ) { };實例對象&#xff1a;let f1new Foo;let o1new …

Oracle觸發器和MySQL觸發器之間的區別

原文鏈接&#xff1a;http://blog.csdn.net/a19881029/article/details/37820363 -----------------------------------------------------------Oracle觸發器格式&#xff1a;[plain] view plaincopyCREATE [OR REPLACE] TRIGGER trigger_name BEFORE|AFTER INSERT|UPDA…

下列選項中不符合python語言變量命名規則的是_學習Python第二日--基本概念和類型...

編程語言分類:解釋型語言和編譯型語言。解釋型語言不會產生額外的文件,運行時一行一行的翻譯。編譯型語言需要產生一個額外的文件,是電腦能夠識別的內容,運行后將產生額外的文件。 變量是可變的量,是它的值可以發生改變。變量的作用是保存值,保存的值可以是數據,而且保存…

HashMap死鎖原因及替代方案

原文鏈接&#xff1a;http://blog.csdn.net/fhzaitian/article/details/51505516 ------------------------------------------------------------------------1、首先我們需要簡單地了解一下HashMap數據結構 HashMap通常會用一個指針數組&#xff08;假設為table[]&#xff09…

優化mysql數據庫_MySQL數據庫十大優化技巧

WEB開發者不光要解決程序的效率問題&#xff0c;對數據庫的快速訪問和相應也是一個大問題。希望本文能對大家掌握MySQL優化技巧有所幫助。1. 優化你的MySQL查詢緩存在MySQL服務器上進行查詢&#xff0c;可以啟用高速查詢緩存。讓數據庫引擎在后臺悄悄的處理是提高性能的最有效方…

跋山涉水——深入 Redis 字典遍歷

Redis 字典的遍歷過程邏輯比較復雜&#xff0c;互聯網上對這一塊的分析講解非常少。我也花了不少時間對源碼的細節進行了整理&#xff0c;將我個人對字典遍歷邏輯的理解呈現給各位讀者。也許讀者們對字典的遍歷過程有比我更好的理解&#xff0c;還請不吝指教。一邊遍歷一邊修改…

linux下VI模式中上下左右鍵和回退鍵出現字母

原文地址&#xff1a;http://blog.csdn.net/u012860950/article/details/50127779 ---------------------------------------------------------------- 1.編輯/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的擁有者是root用戶&#xff0c;所以要在root的權限下對這個文件進行修…

mysql數據庫查詢優化建議_mysql數據庫查詢優化的24條建議

MySQL是一個強大的開源數據庫。隨著MySQL上的應用越來越多&#xff0c;MySQL逐漸遇到了瓶頸。這里提供一些關于Mysql 數據庫查詢優化的24條優化建議&#xff0c;僅供參考。Mysql 查詢優化1、使用慢查詢日志&#xff0c;找出執行慢的查詢。2、使用 EXPLAIN 來決定查詢功能是否合…

常規sql讀取CLOB

plsql下&#xff0c;普通sqlsql-cmd下總結&#xff1a; 常規的sql&#xff0c;查詢clob字段&#xff0c;只能顯示部分內容。 查clob內容select dbms_lob.substr(c_content) from table_content t dbms_lob.substr將大文本轉換字符類型讀出來.dbms_lob.substr的轉換對字段conten…

精解 ES6箭頭函數

&#x1f431; 個人主頁&#xff1a;SHOW科技&#xff0c;公眾號&#xff1a;SHOW科技 &#x1f64b;?♂? 作者簡介&#xff1a;2020參加工作&#xff0c;專注于前端各領域技術&#xff0c;共同學習共同進步&#xff0c;一起加油呀&#xff01; &#x1f4ab;優質專欄&#x…

硬盤主引導記錄詳解

說明&#xff1a;硬盤主引導記錄獨立于操作系統&#xff0c;但又和操作系統息息相關——很多時候它又是由; 操作系統所提供的工具所生成&#xff08;例外的情況是您使用了其他的分區工具&#xff0c;不過它又運行在; 什么操作系統中呢&#xff1f;;(&#xff09;。;; 如果您安裝…

Oracle char varchar varchar2 nvarchar2 的區別

上面字符類型能保存多少個字符與oracle當前的字符集有關系。 select userenv(language) from dual; 假設長度2000字節&#xff0c; 如果字符集是16位編碼的&#xff0c;ZHS16GBK&#xff0c;那么每個字符16位&#xff0c;2字節&#xff0c;所以可以容納1000字符。 如果是32位編…

樹莓派lnmp安裝mysql_在樹莓派上安裝 LNMP

樹莓派支持安裝非常多的操作系統&#xff0c;如官方所展示&#xff1a;這里我選擇了推薦的 Raspbian 系統&#xff0c;它基于 Debian&#xff0c;這就意味著我可以按照 Debian 的方式來安裝軟件。一、安裝 Nginx0、先將系統更新到最新狀態$ sudo apt-get update && sud…

openlayers5之熱力圖heatmap

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/gisdoer/article/details/81745645 openlayers5之熱力圖 點擊查看文章

maven項目在打war包時出現非法字符: '\ufeff' 解決方案

http://blog.csdn.net/qi_fei/article/details/61416319 --------------------------------------------問題描述&#xff1a; 開發工具MyEclipse 的總體開發環境&#xff0c;編碼格式總體設置為UTF-8&#xff0c;在將web項目打包的時候出現&#xff1a;非法字符&#xff1a;\u…

0027-生成圓

題目 生成圓難度級別&#xff1a;A&#xff1b; 運行時間限制&#xff1a;1000ms&#xff1b; 運行空間限制&#xff1a;51200KB&#xff1b; 代碼長度限制&#xff1a;2000000B 試題描述給你一些特殊的圓&#xff0c;每個這樣的圓每秒可以產生一個普通的圓&#xff0c;如果給你…

mysql啟多_MySQL啟多個實例

很多朋友都想在一臺服務器上運行多個MySQL Instance&#xff0c;究竟怎么做呢&#xff1f;首先要明晰幾個原理&#xff0c; 簡稱為mysqld讀取my.cnf的順序&#xff1a;第一搜&#xff0c;首先讀取/etc/my.cnf&#xff0c;多實例這個配置文件不會存在。&#xff1a;-(第二搜&…