① 如何使用強大的php函數對數組進行排序
如果你已經使用了一段時間PHP的話,那麼,你應該已經對它的數組比較熟悉了——這種數據結構允許你在單個變數中存儲多個值,並且可以把它們作為一個集合進行操作。
經常,開發人員發現在PHP中使用這種數據結構對值或者數組元素進行排序非常有用。PHP提供了一些適合多種數組的排序函數,這些函數允許你在數組內部對元素進行排列,也允許用很多不同的方法對它們進行重新排序。在這篇文章中我們將討論該排序中最重要的幾個函數。
簡單排序
首先,讓我們來看看最簡單的情況:將一個數組元素從低到高進行簡單排序,這個函數既可以按數字大小排列也可以按字母順序排列。PHP的sort()函數實現了這個功能,如Listing A所示:
Listing A
<?php
 $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
<?php $data = array(5,8,1,7,2);rsort($data); print_r($data);
?>
它的輸出結果如下:
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
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
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
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下面是它的輸出結果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根據用戶自定義的規則排序
PHP也能讓你定義自己的排序演算法,你可以通過創建你自己的比較函數,並把它傳遞給usort()函數。如果第一個參數比第二個參數「小」的話,比較函數必須返回一個比0小的數,如果第一參數比第二個參數「大」的話,比較函數應該返回一個比0大的數。
Listing I就是這樣的一個例子,在這個例子中根據它們的長度對數組元素進行排序,最短的項放在最前面:
Listing I
<?php $data = array("[email protected]", "[email protected]", "[email protected]", "[email protected]");usort($data, 'sortByLen');
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] => [email protected]
[1] => [email protected]
[2] => [email protected]
[3] => [email protected]
)
自然語言排序
PHP有一個非常獨特的排序方式,這種方式使用認知而不是使用計算規則。這種特性稱為自然語言排序,當創建模糊邏輯應用軟體的時候這種排序方式非常有用。下面大家可以來看看它的一個簡單例子,如Listing G所示:
Listing G
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
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
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下面是它的輸出結果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根據用戶自定義的規則排序
PHP也能讓你定義自己的排序演算法,你可以通過創建你自己的比較函數,並把它傳遞給usort()函數。如果第一個參數比第二個參數「小」的話,比較函數必須返回一個比0小的數,如果第一參數比第二個參數「大」的話,比較函數應該返回一個比0大的數。
Listing I就是這樣的一個例子,在這個例子中根據它們的長度對數組元素進行排序,最短的項放在最前面:
Listing I
<?php $data = array("[email protected]", "[email protected]", "[email protected]", "[email protected]");usort($data, 'sortByLen');
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] => [email protected]
[1] => [email protected]
[2] => [email protected]
[3] => [email protected]
)
多維排序
最後,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.PHP基本上就是一種數組語言。時常要進行大量的數組循環操作,主要有兩種方式,
一種是foreach,另一種是while,
代碼如下:
foreach
($array
as
$value)
{
echo
$value;
}
while
(list($key)
=
each($array))
{
echo
$array[$key];
}
foreach
($array
as
$value)
{
echo
$value;
}
while
(list($key)
=
each($array))
{
echo
$array[$key];
}
2.在循環里進行的是數組「寫」操作,則while比foreach快:
foreach
($array
as
$key
=>
$value)
{
echo
$array[$key]
=
$value
.
'...';
}
while
(list($key)
=
each($array))
{
$array[$key]
=
$array[$key]
.
'...';
}
foreach
($array
as
$key
=>
$value)
{
echo
$array[$key]
=
$value
.
'...';
}
while
(list($key)
=
each($array))
{
$array[$key]
=
$array[$key]
.
'...';
}
③ 在php中如何對一個數組進行升序和降序排列
升序:sort()函數
降序:rsort()函數
<?php
$people=array('name','sex','nation','birth');
foreach ($people as $mychrs)
echo $mychrs." ";
sort($people);
echo "<br />---排序後---<br />";
foreach ($people as $mychrs)
echo $mychrs." ";
?>
PHP中除了升序函數以外,還有降序或稱反向排列的函數,就是rsort()函數,比如:
$num1=range(1,9);
rsort($num1);
這里其實就相當於range(9,1)
④ PHP 怎樣判斷一個數字的倒數第二三位為不為零
假設數據在A列,從A1開始,要在B1單元格找到A列不為0的第二個數字,B1
=INDEX(A:A,SMALL(IF(A:A<>0,ROW(A:A),9E307),ROW(A2)))
輸入結束後按Ctrl+shift+Enter完成公式。
⑤ php取數組末尾幾個值 array
$arr=array_slice($arr,-1);//倒數1個
$arr=array_slice($arr,-2);//倒數2個
$arr=array_slice($arr,-3);//倒數3個
$arr=array_slice($arr,-4);//倒數4個
$arr=array_slice($arr,-5);//倒數5個
⑥ php是什麼意思
php通常指超文本預處理器,用於面向對象、命令式編程,是一種通用開源腳本語言。
主要特點:
為開源性和免費性、快捷性、資料庫連接的廣泛性、面向過程和面向對象並用。優點是利於學習,使用廣泛。此外,php還可以指菲律賓比索的標准貨幣代碼符號,MPLS網路中的倒數第二跳彈出功能。是英文超級文本預處理語言Hypertext Preprocessor的縮寫。PHP 是一種HTML 內嵌式的語言,是一種在伺服器端執行嵌入HTML文檔的腳本語言,語言風格有些類似於C語言,被廣泛的運用。
簡介:
PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
特性包括:
1、PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法
2、PHP可以比CGI或者Perl更快速的執行動態網頁——動態頁面方面,與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;PHP具有非常強大的功能,所有的CGI的功能PHP都能實現
3、 PHP支持幾乎所有流行的資料庫以及操作系統。
4、最重要的是PHP可以用C、C++進行程序的擴展!
語言特點:
開源免費
PHP是一個受眾大並且擁有眾多開發者的開源軟體項目,linux + Nginx + Mysql + PHP是它的經典安裝部署方式,相關的軟體全部都是開源免費的,所以使用PHP可以節約大量的正版授權費用。不過PHP作為一個開源軟體,它缺乏大型科技公司的支持背景,網路上對它的唱衰也是經久不衰,不過它的持續迭代和性能持續增強的現實卻是鼓舞人心的,PHP社區用實際行動給予各種質疑強有力的回擊。
快捷高效
PHP的內核是C語言編寫的基礎好效率高,可以用C語言開發高性能的擴展組件;PHP的核心包含了數量超過1000的內置函數,功能應有盡有很全面,開箱即用程序代碼簡潔; PHP數組支持動態擴容,支持以數字、字元串或者混合鍵名的關聯數組,能大幅提高開發效率; PHP是一門弱類型語言,程序編譯通過率高,相對其他強類型語言開發效率快;PHP天然熱部署,在php-fpm運行模式下代碼文件覆蓋即完成熱部署;PHP經過20多年的發展,在互聯網上可以搜到海量的參考資料供參考學習。
性能提升
PHP版本越高它的整體性能越高,根據官方介紹,PHP7.0.0 對比PHP5.6性能就提升了2倍,PHP7.4已經比PHP7.0快了約30%,PHP8.0在性能上又相對PHP7.4大約改進了10%。PHP 8.0 引入了 JIT編譯器特性,同時加入多種新的語言功能,例如命名參數、聯合類型、註解、Constructor Property Promotion、match 表達式、nullsafe 運算符以及對類型系統、錯誤處理和一致性的改進。PHP擁有自己的核心開發團隊,保持5年發布一個大版本、1個月發布2個小版本的頻率,最新的版本是PHP8.08 。
跨平台
每個平台都有對應的php解釋器版本,指針對不同平台均編譯出目標平台的二進制碼(PHP解釋器),php開發的程序可以不經修改運行在windows、linux、unix等多個操作系統上。
常駐內存
php-cli模式下可以實現程序常駐內存,各種變數和資料庫連接都能長久保存在內存實現資源復用,比較常用的做法是結合swoole 組件編寫cli框架。
頁面生命周期
在php-fpm模式下,所有的變數都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空,對程序員水平要求低,佔用內存非常少,特別適合中小型系統的開發。
運行機制:
PHP常見的運行模式有2種,分別是php-fpm 和php-cli 。當PHP 選擇運行在php-fpm模式下,所有的變數都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空。運行在php-cli模式下可以實現程序常駐內存,各種變數和資料庫連接都能長久保存在內存 實現資源復用,性能可以得到很大的提升,php-cli開發比較復雜能但是能夠獲取更高的性能,對開發者的要求比較高需要比較高的開發水平,比較常用的模式是結合swoole 組件編寫cli框架,各種變數能保存在跨進程的高性能共享內存 Table ,可以開發出支持熱啟動的php-cli可靠各類應用系統。
php-fpm在PHP 5.3.3 版本成為了官方正式組件(2010-07-22),它提供了穩定可靠的進程管理服務,進程不足時候可以智能擴充數量,閑置時候可以自動回收銷毀多餘的進程,同時它對程序的容錯能力很強大運行非常穩定,可以應付企業級的開發需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互聯網協議下進行的用戶的輸入輸出,頁面級生命周期各種資源用完即釋放,不存在內存泄漏的問題。php-fpm也提供有一些常駐內存的技術支持,例如PHP 7.4引入的opcache.preload也能實現局部的PHP類和函數的常駐內存,不過這個方法不夠靈活,和伺服器配置捆綁的太死了。
php-cli因為能實現各類資源的常駐內存,所以可以資源復用,更高效完成多進程編程和非同步編程,可以開發出負載能力更高的應用系統。但是相對php-fpm的簡單編程開發,開發者要注意很多的事項和需要做很多附加的控制器開發,否則就無法實現期待中的高性能。
首先開發者需要去實現可靠的進程管理服務,保證系統進程遇到各類錯誤退出運行後能夠自動創建新的進程,只有這樣才能保證後續的服務請求有足夠空閑進程可分配。每個業務代碼段都要做異常處理,讓進程遇到非致命錯誤時候不會退出,因為進程重啟意味程序和各類資源需要再次載入,這個過程性能消耗不小,所以只有進程穩定運行了常駐內存才有意義。
其次因為常駐內存,編寫的新的程序必須重啟服務才能生效,這一點習慣了fpm模式的開發者會感到比較陌生。另外開發者需要手工釋放內存,否則系統長時間運行後會出現內存泄露。同時在cli模式下,我們不能像fpm里直接用 $_SERVER、$_POST、$_GET、$_COOKI和$_FILES 進行編程工作,需要自己去解析各種互聯網通訊協議完成用戶的輸入輸出。要實現多進程編程利用多核CPU計算,還有學習使用pcntl和posix編程,這里涉及到了非同步編程邏輯,這塊難度還是比較大的。比較常用的模式是結合swoole 組件編寫cli框架。
PHP是一個活躍的社區開發語言,有專業的核心開發團隊在持續不斷的迭代,最近一個版本就是PHP 8.0.8 引入了很多的新特性。
語言參考:
內置函數
PHP 有很多標準的函數和結構。還有一些函數需要和特定的擴展模塊一起編譯,否則在使用它們的時候就會得到一個致命的「未定義函數」錯誤。例如,要使用 image 函數中的 imagecreatetrue,需要在編譯 PHP 的時候加上 GD 的支持。或者要使用 mysqli_connect函數,就需要在編譯 PHP 的時候加上 MySQLi 支持。有很多核心函數已包含在每個版本的 PHP 中如字元串和變數函數。調用 phpinfo或者 get_loaded_extensions可以得知 PHP 載入了那些擴展庫。同時還應該注意,很多擴展庫默認就是有效的。
靜態網站與動態網站的區別
靜態網站:web1.0 時代
動態網站:web2.0 時代
靜態網站特點:
1、網頁內容一經發布到網站伺服器,無論是否有用戶訪問,每個靜態頁面的內容都是保存在網站伺服器上的。也就是說,靜態網頁是實實在在保存在伺服器上的文件,每個網頁都是一個獨立的文件。
2、靜態網頁的內容相對穩定,因此容易被搜索引擎檢索。
3、 靜態網頁沒有資料庫的支持,在網站製作和維護方面工作量較大,因此當網站信息量很大時完全依靠靜態網頁製作方式比較困難。
4、靜態網頁的交互性較差,在功能方面有較大的限制。
⑦ php數組中怎麼把前半部分元素的值和後半部分元素中的值對換
先計算出數組的長度 將此長度除以2 然後循環此數組,循環次數為除以2的值.
將數組中第一個數值和最後一個替換 第二個和倒數第二份替換 依次類推就行了
⑧ PHP數組取值問題
本人寫了個函數來查找記錄,稍微做了通用性擴展,湊合著用吧,下面為測試代碼:
$a = array (
array('id' => 1, 'edition' => 'a'),
array('id' => 2, 'edition' => 'b'),
array('id' => 3, 'edition' => 'c'),
array('id' => 4, 'edition' => 'd'),
array('id' => 5, 'edition' => 'e'),
array('id' => 6, 'edition' => 'f'),
array('id' => 7, 'edition' => 'g'),
array('id' => 8, 'edition' => 'h'),
array('id' => 9, 'edition' => 'i'),
array('id' => 10, 'edition' => 'j'),
array('id' => 11, 'edition' => 'k'),
array('id' => 12, 'edition' => 'l'),
array('id' => 13, 'edition' => 'm'),
array('id' => 14, 'edition' => 'n'),
array('id' => 15, 'edition' => 'o'),
array('id' => 16, 'edition' => 'p'),
array('id' => 17, 'edition' => 'q'),
array('id' => 18, 'edition' => 'r'),
array('id' => 19, 'edition' => 's'),
array('id' => 20, 'edition' => 't')
);
/**
* 返回相鄰N條記錄,若返回空數組則說明沒有找到該記錄
* $records為記錄數組,$id為要查找的記錄,$num為要返回的記錄數,默認為10
*/
function getRecords($records,$id,$num=10){
$arrayRet=array();//返回數組初始化
$num=(int)$num;
if($num<1 || !is_array($records)){//參數有問題
return $arrayRet;
}
$records=array_values($records);
$len=count($records);//記錄個數
$pos=NULL;//存儲查找到的記錄位置
//查找
foreach($records as $k=>$v){
if(isset($v['id']) && $v['id'] == $id){
$pos=$k;
break;
}
}
if(is_int($pos)){//查找到了記錄
$low=$pos-1;
$high=$pos+1;
$total=0;
$limit=$pos-(int)($num/2);
if($limit<0)
$limit=0;
while($total<$num && $low>=$limit){
array_unshift($arrayRet,$records[$low]);
--$low;
++$total;
}
$limit=$pos+($num-$total);
if($limit>=$len)
$limit=$len-1;
while($total<$num && $high<=$limit){
array_push($arrayRet,$records[$high]);
++$high;
++$total;
}
$limit=0;
while($total<$num && $low>=$limit){
array_unshift($arrayRet,$records[$low]);
--$low;
++$total;
}
}
return $arrayRet;
}
//以下為使用示例:
echo "查找id為12的記錄,返回10條:\n";
print_r(getRecords($a,12));//查找id為12的記錄,返回10條
echo "\n\n查找id為3的記錄,返回5條\n";
print_r(getRecords($a,3,5));//查找id為3的記錄,返回5條
echo "\n\n查找id為293的記錄,返回15條\n";
print_r(getRecords($a,293,15));//查找id為293的記錄,返回15條
⑨ php如何數組中輸出倒數第二位的值
<?php
$arr = array(1,3,4,5,3,5,543,534,5,34,5,345,34,5,234324);
$arr = array_slice($arr,-2,1);
print_r($arr);
?>
⑩ php 數組 固定條數 倒序
其實多看看php手冊還是有幫助的,LZ所說的正序和倒序是用在什麼上?如果是數組上直接使用: 對數組按照鍵名排序:ksort($array) 對數組按照鍵名逆向排序:krsort($array) 對數組進行排序並保持索引關系:asort($array) 對數組進行逆向排序並保持...