數組的概述
PHP 中的數組實際上是一個有序圖。圖是一種把 values 映射到 keys 的類型。此類型在很多方面做了優化,因此可以把它當成真正的數組來使用,或列表(矢量),散列表(是圖的一種實現),字典,集合,棧,隊列以及更多可能性。因為可以用另一個 PHP 數組作為值,也可以很容易地模擬樹。
所謂的 數組下標 可以視為資料內容在此數組中的識別名稱,通常被稱為數組下標。
當索引值為數值時,也代表此資料內容在數組中的儲存位置。
數組中有幾個層次就被稱為幾維數組。
數組分類:
在PHP中有兩種數組:索引數組和關聯數組。
索引(indexed)數組的索引值是整數,以0開始。當通過位置來標識東西時用索引數組。
關聯(associative)數組以字符串做為索引值,關聯數組更像操作表。索引值為列名,用于訪問列的數據。
數組的定義
1 直接賦值的方式聲明數組
數組常用的賦值方式:
由于 PHP 是屬于弱類型數據,因此源代碼中的數組并不需要經過特別的聲明操作,直接將一組數值指定給某一數組元素即可。一般情況下數組的賦值有兩種方式:
- 直接賦值方式 如:
$a[0]='spam@126.com';
$a[1]='abuse@sohu.com';
- 使用array函數 如:
$a=array('spam@126.com','abuse@sohu.com');
直接賦值格式:
$數組變量名[索引值]=資料內容
其中索引值(下標)可以是一個字符串或一個整數。等價于整數(不以0開頭)的字符串值被當作整數對待。因此,數組$array[3]與$array[‘3’]是引用相同的元素。但是$array[‘03’]引用的另外不同的元素。
一維數組
數組中索引值(下標)只有一個的數組稱為一維數組。在數組中這是最簡單的,也是最常用的了。
實例1:
<?php
$a[0]=1;
$a[1]=2;
$a[2]=3;
$b[]=1;
$b[]=2;
$b[]=3;
$b[6]=4;
$b[]=5;
?>
實例2:
<?php
$a["name"]="zhang";
$a["sex"]="man";
$a["age"]=23;
$b["name"]="lisi";
$b[]="woman";
$b["age"]=28;
$b[8]=4;
$b[]=5;
?>
2 使用array( )語言結構新建數組
格式:
array( [key =>] value , ... )
// key 可以是 integer 或者 string
// value 可以是任何值
key 可以是 integer 或者 string。如果鍵名是一個 integer 的標準表達方法,則被解釋為整數(例如 “8” 將被解釋為 8,而 “08” 將被解釋為 “0”)。key 中的浮點數被取整為 integer。
如果對給出的值沒有指定鍵名,則取當前最大的整數索引值,而新的鍵名將是該值加一。如果指定的鍵名已經有了值,則該值會被覆蓋。
實例:
<?php
$a=array(1,2,3,4,5,6);
$b=array("one", "two", "three");
$c=array(0=>"aaa",1=>"bbb",2=>"ccc");
$d=array("aaa",6=>"bbb","ccc");
$e=array("name"=>"zhang", "age"=>20);
?>
3 多維數組的聲明
多維數組的聲明方式及規則,與一維數組相同,例如:下面二維數組的聲明片段:
<?php
$a[0] = 0;
$a[0] = 1;
$a['string'][0] = 'Zero';
$a['string'][1] = 'One';
?>
如果以 array 語法聲明,則如下程序片段:
<?php
$a = array(
0=>array(0,1),
'string'=>array('Zero','One'),
);
?>
數組的遍歷
1 使用for語句循環遍歷數組
<?php
$arr=array(1, 3, "for"=>4, 5, 6, 7, 8,9,10=>"aa",
"bb", "cc");
for($i=0; $i<count($arr); $i++){
echo "\$arr[".$i."]=".$arr[$i]."<br>";
}
?>
2 使用foreach語句遍歷數組
foreach循環結構:
foreach 僅用于數組,有兩種語法。
foreach ($arr as $value) {
}
foreach ($arr as $key => $value) {
}
第一種格式遍歷給定的 array_expression 數組。每次循環中,當前單元的值被賦給 $value 并且數組內部的指針向前移一步
第二種格式做同樣的事,只除了當前單元的鍵值也會在每次循環中被賦給變量 $key。
注: 當 foreach 開始執行時,數組內部的指針會自動指向第一個單元。此外注意foreach 所操作的是指定數組的一個拷貝,而不是該數組本身。
<?php
$a=array(10,20,30,40,50,60);
foreach($a as $k=>$v) {
echo "$k => $v <br>";
}
?>
3 聯合使用list( )、each( )和while循環遍歷數組
array each ( array array)
返回 array 數組中當前指針位置的鍵/值對并向前移動數組指針。鍵值對被返回為四個單元的數組,鍵名為 0,1,key 和 value。單元 0 和 key 包含有數組單元的鍵名,1 和 value 包含有數據。
如果內部指針越過了數組的末端,則 each() 返回 FALSE。
each() 經常和list( ) 結合使用來遍歷數組。
void list ( mixed ...)
它不是真正的函數,而是語言結構。list() 用一步操作給一組變量進行賦值。
注: list() 僅能用于數字索引的數組并假定數字索引從0開始。
在執行 each() 之后,數組指針將停留在數組中的下一個單元或者當碰到數組結尾時停留在最后一個單元。如果要再用 each 遍歷數組,必須使用reset( )。
<?php
$fruit= array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');
reset($fruit);
while (list($key, $val) = each($fruit)) {
echo "$key => $val\n";
}
$arr=array("one"=>"aaa", "two"=>"bbb", "three"=>"cccc");
while($sz=each($arr)){
//echo $sz[0]."===>".$sz[1]."<br>";
echo $sz["key"]."===>".$sz["value"]."<br>";
}
?>
4 使用數組的內部指針控制函數遍歷數組
數組指針的控制函數
由于數組是由多筆資料集合而成,所以當程序需要運算處理其中某個索引位置的資料內容時,會由數組之中內定的指針,指向目標資料,以提供程序作正確的讀取。下面針對數組指針控制的相關函數,作簡單的說明介紹:
next()、prev()、end()及 reset()
這四個函數可以控制目前數組中的指針位置。
- next()負責將指針向后移動
- prev()負責將指針向前移動
- end()會將指針指向數組中最后一個元素
- reset()函數則會將目前指針無條件移至第一個索引位置。
語法格式:
mixed next(數組名稱); mixed prev(數組名稱);
mixed end(數組名稱); mixed reset(數組名稱);
mixed current(數組名稱); mixed key(數組名稱);
預定義數組
1 服務器變量: $_SERVER
2 環境變量:$_ENV
3 HTTP GET變量:$_GET
4 HHTP POST變量:$_POST
5 request變量:$_REQUEST
6 HTTP文件上傳變量:$_FILES
7 HTTP Cookies:$_COOKIE
8 Session變量:$_SESSION
9 Global變量:$GLOBALS
服務器變量$_SERVER
是一個包含諸如頭信息(header)、路徑(path)和腳本位置(script locations)的數組。數組的實體由 web 服務器創建。不能保證所有的服務器都能產生所有的信息;服務器可能忽略了一些信息,或者產生了一些未在下面列出的新的信息。這是一個自動全局變量。這只不過意味這它在所有的腳本中都有效。在函數或方法中不需要使用 global $_SERVER;
PHP_SELF
:當前正在執行腳本的文件名
DOCUMENT_ROOT
:當前運行腳本所在的文檔根目錄
REMOTE_ADDR
:正在瀏覽當前頁面用戶的 IP 地址。
在解析器運行時,這些變量從環境變量轉變為 PHP 全局變量名稱空間(namespace)。它們中的許多都是由 PHP 所運行的系統決定。完整的列表是不可能的。請查看系統的文檔以確定其特定的環境變量。
這是一個自動全局變量。它在所有的腳本中都有效。在函數或方法中不需要使用 global $_ENV;
環境變量:$_ENV
在解析器運行時,這些變量從環境變量轉變為 PHP 全局變量名稱空間(namespace)。它們中的許多都是由 PHP 所運行的系統決定。完整的列表是不可能的。請查看系統的文檔以確定其特定的環境變量。
這是一個自動全局變量。它在所有的腳本中都有效。在函數或方法中不需要使用 global $_ENV;
HTTP GET變量:$_GET
通過 HTTP GET 方法傳遞的變量組成的數組。是自動全局變量.
http://localhost/login.php?name=zhangsan&id=100
<?php
echo “參數name的值:”.$_GET[“name”]; //zhangsan
echo “參數id的值:”.$_GET[“id”]; //100
?>
HTTP POST變量:$_POST
通過 HTTP POST 方法傳遞的變量組成的數組。是自動全局變量。
與$_GET相似,只是方法不一樣。
request變量:$_REQUEST
此關聯數組包含 $_GET,$_POST 和 $_COOKIE 中的全部內容。
HTTP文件上傳變量:$_FILES
通過 HTTP POST 方法傳遞的已上傳文件項目組成的數組。是自動全局變量。
HTTP Cookies:$_COOKIE
通過 HTTP cookies 傳遞的變量組成的數組。是自動全局變量。
Session變量:$_SESSION
包含當前腳本中 session 變量的數組。參閱 Session 函數文檔以獲得更多信息。
Global變量:$GLOBALS
由所有已定義全局變量組成的數組。變量名就是該數組的索引。
數組的相關處理函數
1 數組的鍵/值操作函數
array_values
-- 返回數組中所有的值
格式:array array_values ( array input )
array_keys
-- 返回數組中所有的鍵名
格式:array array_keys(array input[,mixed search_value [,bool strict]])
其中search_value為則只返回該值的鍵名
in_array
-- 檢查數組中是否存在某個值
格式:bool in_array(mixed needle,array haystack [, bool strict] )
其中strict參數:如果第三個參數 strict 的值為 TRUE 則函數還會檢查needle的類型是否和haystack中類型相同
array_flip
-- 交換數組中的鍵和值
格式:array array_flip ( array trans )
array_reverse -- 返回一個單元順序相反的數組
語法:array array_reverse ( array array [, bool preserve_keys] )
如果 preserve_keys 為 TRUE 則保留原來的鍵名
2 統計數組元素的個數與唯一性
count
-- 計算數組中的單元數目或對象中的屬性個數
語法:int count ( mixed var [, int mode] )
如果可選的 mode 參數設為 COUNT_RECURSIVE(或 1),count() 將遞歸地對數組計數。
array_count_values
-- 統計數組中所有的值出現的次數
語法:array array_count_values ( array input )
array_unique
-- 移除數組中重復的值
語法:array array_unique ( array array )
3 使用回調函數處理數組的函數
array_filter
-- 用回調函數過濾數組中的單元
語法:rray array_filter ( array input [, callback callback] )
依次將 input 數組中的每個值傳遞到 callback 函數。如果 callback 函數返回 TRUE,則 input 數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變。
如果沒有提供 callback 函數,array_filter() 將刪除 input 中所有等值為 FALSE 的條目。
array_walk
--對數組中的每個成員應用用戶函數
語法:bool array_walk ( array &array, callback funcname [, mixed userdata] )
- 如果成功則返回 TRUE,失敗則返回 FALSE。
- 將用戶自定義函數 funcname 應用到 array 數組中的每個單元。典型情況下 funcname 接受兩個參數。array 參數的值作為第一個,鍵名作為第二個。如果提供了可選參數 userdata,將被作為第三個參數傳遞給 callback funcname。
- array_walk() 不會受到 array 內部數組指針的影響。array_walk() 會遍歷整個數組而不管指針的位置。
array_map
-- 將回調函數作用到給定數組的單元上
語法: array array_map ( callback callback, array arr1 [, array ...] )
array_map() 返回一個數組,該數組包含了 arr1 中的所有單元經過 callback 作用過之后的單元。callback 接受的參數數目應該和傳遞給 array_map() 函數的數組數目一致。
4 數組的排序函數
sort
-- 對數組排序(升序)
rsort
-- 對數組逆向排序(降序)
usort
-- 使用用戶自定義的比較函數對數組中的值進行排序
asort
-- 對數組進行排序并保持索引關系(關聯數組排序)
arsort
-- 對數組進行逆向排序并保持索引關系
uasort
-- 用戶自定義的比較函數對數組進行排序并保持索引關聯
ksort
-- 對數組按照鍵名排序
krsort
-- 對數組按照鍵名逆向排序
uksort
-- 使用用戶自定義的比較函數對數組中的鍵名進行排序
natsort
-- 用“自然排序”算法對數組排序
natcasesort
-- 用“自然排序”算法對數組不區分大小寫字母排序
array_multisort
-- 對多個數組或多維數組進行排序
5 拆分、合并、分解與結合數組
array_slice
-- 從數組中取出一段
語法: array array_slice ( array array, int offset [, int length [, bool preserve_keys]] )
- array_slice() 返回根據 offset 和 length 參數所指定的 array 數組中的一段序列。
- 如果 offset 非負,則序列將從 array 中的此偏移量開始。如果 offset 為負,則序列將從 array 中距離末端這么遠的地方開始。
- 如果給出了 length 并且為正,則序列中將具有這么多的單元。如果給出了 length 并且為負,則序列將終止在距離數組末端這么遠的地方。如果省略,則序列將從 offset 開始一直到 array 的末端。
array_combine
創建一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
語法:array array_combine ( array keys, array values )
返回一個 array,用來自 keys 數組的值作為鍵名,來自 values 數組的值作為相應的值。
如果兩個數組的單元數不同或者數組為空時返回 FALSE。
array_merge
-- 合并一個或多個數組
語法: array array_merge ( array array1 [, array array2 [, array ...]] )
- array_merge() 將一個或多個數組的單元合并起來,一個數組中的值附加在前一個數組的后面。返回作為結果的數組。
- 如果輸入的數組中有相同的字符串鍵名,則該鍵名后面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,后面的值將不會覆蓋原來的值,而是附加到后面。
- 如果只給了一個數組并且該數組是數字索引的,則鍵名會以連續方式重新索引。
array_intersect
-- 計算數組的交集
語法 array array_intersect ( array array1, array array2 [, array ...] )
array_intersect() 返回一個數組,該數組包含了所有在 array1 中也同時出現在所有其它參數數組中的值。注意鍵名保留不變。
array_diff
-- 計算數組的差集
語法:array array_diff ( array array1, array array2 [, array ...] )
array_diff() 返回一個數組,該數組包括了所有在 array1 中但是不在任何其它參數數組中的值。注意鍵名保留不變。
6 數組與數據結構
array_pop
-- 將數組最后一個單元彈出(出棧)
語法:mixed array_pop ( array &array )
array_pop() 彈出并返回 array 數組的最后一個單元,并將數組 array 的長度減一。如果 array 為空(或者不是數組)將返回 NULL。
array_push
-- 將一個或多個單元壓入數組的末尾(入棧)
語法:int array_push ( array &array, mixed var [, mixed ...] )
array_push() 將 array 當成一個棧,并將傳入的變量壓入 array 的末尾。array 的長度將根據入棧變量的數目增加。
array_shift
-- 將數組開頭的單元移出數組
語法:mixed array_shift ( array &array )
array_shift() 將 array 的第一個單元移出并作為結果返回,將 array 的長度減一并將所有其它單元向前移動一位。所有的數字鍵名將改為從零開始計數,文字鍵名將不變。如果 array 為空(或者不是數組),則返回 NULL。
array_unshift
-- 在數組開頭插入一個或多個單元
語法: int array_unshift ( array &array, mixed var [, mixed ...] )
array_unshift() 將傳入的單元插入到 array 數組的開頭。注意單元是作為整體被插入的,因此傳入單元將保持同樣的順序。所有的數值鍵名將修改為從零開始重新計數,所有的文字鍵名保持不變。
7 其他有用的數組處理函數
array_rand
-- 從數組中隨機取出一個或多個單元
shuffle
-- 將數組打亂
Have a try
- 分別使用for循環與foreach遍歷輸出下面數組中的值,并求出總和:
$a = array(10,30,50,70,90); - 使用list()、each與 while組合輸出數組中的值:
$subject = array(“Linux”,”PHP”,”MySQL”,”HTML”,”CSS”,”JQuery”) - 使用reset(),end(),prev(),next(),key(),current();與do…while組合倒著輸出數組中的值:
$subject = array(“Linux”,”PHP”,”MySQL”,”HTML”,”CSS”,”JQuery”) - 使用foreach循環輸出數組中的值,并使用表格顯示。
$stulist = array(
array("name" => "張三", "age" => 20, "sex" => "女"),
array("name" => "李四", "age" => 21, "sex" => "男"),
array("name" => "王五", "age" => 22, "sex" => "女"),
array("name" => "趙六", "age" => 24, "sex" => "男"),
);
- 從全局變量中獲取服務器端的主機、IP、端口等信息 客戶端的系統、瀏覽器、IP地址等信息。