一、數組概述
1.1 數組是複合類型
1.2 數組中可以儲存任意長度的資料, 也可以儲存任意類型的資料
二、數組的類型
2.1 索引數組: 下標是順序整數作為索引
<?php$user[0] = 1;$user[1] = "zhangsan";$user[2] = "aaa@bb.com";echo '<pre>';print_r($user);echo '</pre>';?>
2.2 關聯陣列: 下標是字串作為索引
<?php$user["id"] = 1;$user["name"] = "zhangsan";$user["email"] = "aaa@bb.com";echo '<pre>';print_r($user);echo '</pre>';$user["name"] = "lisi";echo $user["name"];?>
三、數組的多種聲明方式
3.1 直接為數組元素賦值
a. 如果索引下標不給值,就會從0開始順序索引
b. 如果給出索引下標,下一個就會是從最大的開始增1
c. 如果後面出現前面的下標,如果是賦值就是為前面的元素重新賦值
d. 混合聲明時,索引和關聯不互相影響(不影響索引下標的聲明)
3.2 使用array()函數
a. 預設是索引數組
b. 如果為關聯陣列和索引數組指定下標,使用 鍵=>值
c. 多個成員之前使用“,”分割
<?php$user1 = array (1, "zhsangsan", 10, "nan", "aaa@bbb.com");echo '<pre>';print_r($user1);echo '</pre>';/** Array( [0] => 1 [1] => zhsangsan [2] => 10 [3] => nan [4] => aaa@bbb.com ) */$user2 = array("id"=>1, "name"=>"zhsangsan", "age"=>10, 100=>"nan", "aaa@bbb.com");echo '<pre>';print_r($user2);echo '</pre>';/** Array( [id] => 1 [name] => zhsangsan [age] => 10 [100] => nan [101] => aaa@bbb.com ) */?>
重要知識點: 二維數組
<?php$info=array("user"=>array(array(1, "zansan", 10, "nan"),array(2, "lisi", 20, "nv") ));echo $info["user"][1][1]; // lisiecho '<pre>';print_r($info);echo '</pre>';/** Array ( [user] => Array ( [0] => Array ( [0] => 1 [1] => zansan [2] => 10 [3] => nan ) [1] => Array ( [0] => 2 [1] => lisi [2] => 20 [3] => nv ) )) */?>
四、數組的遍曆
4.1 使用for語句迴圈遍曆(不推薦)
局限性: 數組必須是索引數組, 而且下標必須是連續的 (然而索引數組下標可以不連續, 數組還可能是關聯陣列)
<?php $user = array(1, "zhasna", "aaa@bb.com");for($i = 0; $i < count($user); $i++){echo "\$user[{$i}]=".$user[$i]."<br>";}/** $user[0]=1$user[1]=zhasna$user[2]=aaa@bb.com */?>
4.2 使用foreach語句迴圈遍曆(強烈推薦)
迴圈次數由數組的元素個數決定, 每一次迴圈都會將數組中的元素分別賦值給後面的變數
<?php $user=array(1, "name"=>"zhasna", "age"=>40, 100=>"nan", "aaa@bb.com"); foreach($user as $key => $val){ // $var 是自訂變數, $key自訂變數 echo $key." =====> ".$val."<br>"; } /* 0 =====> 1name =====> zhasnaage =====> 40100 =====> nan101 =====> aaa@bb.com */ foreach($user as $val){ // 不要key也可以, 直接遍曆$user的值 echo $val."<br>"; } /* 1 zhasna40nanaaa@bb.com */?>
4.3 使用while(), list(), each() 組合迴圈遍曆(不推薦)
each() 函數:
* 需要一個數組作為參數
* 返回來的也是一個數組
* 返回來的數組時0, 1, key, value四個下標, 0和key下標是當前數組元素的鍵, 1和value下標是當前數組元素的值
* 預設當前元素就是第一個元素
* 每執行一次後就會將當前元素向後移動
* 如果已經到了最後還執行這個函數, 則返回false
<?php$user = array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");while($arr = each($user)){// echo $arr[0]."==>".$arr[1]."<br>";echo $arr["key"]." ----> ".$arr["value"]."<br>";}/** id ----> 1name ----> zhangsanage ----> 10sex ----> nan */?>
list() 函數:
* list()=array(); 需要將一個數組賦值給這個函數
* 數組中的元素個數要和list()函數中的參數個數相同
* 數組中的每個元素值會賦值給list()函數中的每個參數,list()將每個參數轉為變數
* list()只能接收索引數組
<?phplist($name, $age, $sex) = array("zansan", 10, "nnnnn");echo $name."<br>";echo $age."<br>"; // list中的值和數組中的值一一對應echo $sex."<br>"; // 如果不想給name賦值, 那就寫成list(, $age, $sex)/* zansan10nnnnn */ $user1 = array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");list($key, $value) = each($user1); // Array ( [1] => 1 [0] => id ) echo $key." --> ".$value;/* id --> 1 */$user2 = array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");while(list($key, $value) = each($user2)){echo $key." ==> ".$value."<br>";}/* name ==> zhangsanage ==> 10sex ==> nan */?>
五、預定義數組
自動全域變數 -- 超全域數組
1. 包含了來自WEB伺服器,用戶端,運行環境和使用者輸入的資料
2. 預定義數組在全域範圍內自動生效,例如在函數中不用聲明global也可以使用這些數組
3. 使用者不能自訂這些數組, 但這些資料操作方式又和我們自訂的數組操作方式一樣
* $_GET // 經由URL請求提交至指令碼的變數
* $_POST // 經由HTTP POST方法提交到指令碼的變數
* $_REQUEST // 經由GET, POST和COOKIE機制提交到指令碼的變數,因此該數組並不值得信任,盡量不去使用
* $_FILES // 經由HTTP POST 檔案上傳而提交至指令碼的變數
* $_COOKIE //
* $_SESSION //
* $_ENV // 執行環境提交至指令碼的變數
* $_SERVER // 變數由WEB伺服器設定的,或直接和當前指令碼的執行環境相關聯
* $GLOBALS // 只要是當前指令碼有效變數都在這裡,數組鍵名為全域變數的名稱
<?phpprint_r($_GET);echo $_GET["username"]."<br>"; // 擷取get方式url中的usernameprint_r($_POST);echo $_POST["uname"]."<br>"; // 擷取post方式表單提交的unameprint_r($_REQUEST);echo $_ENV["OS"]."<br>"; // 擷取key為'OS'的valueecho $_SERVER["DOCUMENT_ROOT"]."<br>"; // 擷取key為'DOCUMENT_ROOT'的value$a = 100; // 定義的變數會存到$GLOBALS中function demo(){echo $GLOBALS["a"]."<br>"; // 無需聲明global就可以直接取值}demo();?><form action="demo.php" method="post"> <!-- post方式提交資料, 資料會存到$_POST中 -->username: <input type="text" name="uname"><br>password: <input type="password" name="pass"><br><input type="submit" value="login"> <br></form><a href="demo.php?username=zhangsan">this is a $_GET test</a> <!-- get方式提交資料, 資料會存到$_GET中 -->
六、數組相關函數
1. 數組鍵/值操作有關的函數
* 1.1 array_values() 返回 input 數組中所有的值並給其建立數字索引
<?php$array = array ("size" => "XL","color" => "gold");print_r(array_values($array));/*Array( [0] => XL [1] => gold) */?> * 1.2 array_keys() 返回數組中所有的鍵名
<?php$array = array (0 => 100,"color" => "red");print_r(array_keys($array));/* Array( [0] => 0 [1] => color) */?>
* 1.3 in_array() 檢查數組中是否存在某個值
<?php$os = array ("Mac", "NT", "Irix", "Linux");if (in_array("Irix", $os)) {echo "Got Irix";}if (in_array("mac", $os)) {echo "Got mac";}?> * 1.4 array_key_exists 當給定的key存在於數組中時返回
TRUE
<?php$search_array = array ('first' => 1,'second' => 4);if (array_key_exists('first', $search_array)) {echo "The 'first' element is in the array";}?> * 1.5 array_flip 交換數組中的鍵和值
<?php$trans = array ("a" => 1,"b" => 1,"c" => 2);$trans = array_flip($trans);print_r($trans); // Array ( [1] => b [2] => c ) // 如果同一個值出現了多次,則最後一個鍵名將作為它的值,所有其它的都丟失了?> * 1. 6 array_reverse 返回一個單元順序相反的數組
<?php$input = array ("php",4.0,array ("green","red"));$result = array_reverse($input);print_r($result);// Array ( [0] => Array ( [0] => green [1] => red ) [1] => 4 [2] => php ) ?> 2. 統計數組元素的個數和惟一性
* 2. 1 count() sizeof();
<?php$a[0] = 1;$a[1] = 3;$a[2] = 5;$result = count($a);print_r($result); // 3?>
* 2. 2 array_count_values 統計數組中所有的值出現的次數
<?php$array = array (1,"hello",1,"world","hello");echo "<pre>";print_r(array_count_values($array));echo "</pre>";/* Array( [1] => 2 [hello] => 2 [world] => 1) */
* 2. 3 array_unique 移除數組中重複的值
<?php$input = array("a" => "green", "red", "b" => "green", "blue", "red");$result = array_unique ($input);echo "<pre>";print_r($result);echo "</pre>";/* Array( [a] => green [0] => red [1] => blue) */?> 3. 使用回呼函數處理數組的函數
* 3.1 array_filter() 用回呼函數過濾數組中的單元
<?phpfunction odd($var) {// returns whether the input integer is oddreturn ($var & 1);}$array = array ("a" => 1,"b" => 2,"c" => 3);echo "<pre>";print_r(array_filter($array, "odd"));echo "</pre>";/* Array( [a] => 1 [c] => 3) */?>
* 3.2 array_walk() 使用使用者自訂函數對數組中的每個元素做回調處理
<?php$fruits = array ("d" => "lemon","a" => "orange","b" => "banana","c" => "apple");// funcname 接受兩個參數。array參數的值作為第一個,鍵名作為第二個。function test_print($item, $key) {echo " $key => $item <br />\n";}array_walk($fruits, 'test_print'); /*d => lemona => orangeb => bananac => apple */?>
* 3.3 array_map() 將回呼函數作用到給定數組的單元上
<?phpfunction cube($n){ return($n * $n * $n);}$a = array(1, 2, 3, 4, 5);$b = array_map ("cube", $a);print_r($b);// Array ([0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125) ?>
4. 數組的排序函數
* 4.1 sort() rsort() 簡單的數組排序
<?php$fruits = array("lemon", "orange", "banana", "apple");sort($fruits);foreach ($fruits as $key => $val) { echo "fruits[" . $key . "] = " . $val . "<br>";}/* fruits[0] = applefruits[1] = bananafruits[2] = lemonfruits[3] = orange */?> * 4.2 ksort() krsort() 根據鍵名對數組排序
<?php$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");ksort($fruits);foreach ($fruits as $key => $val){ echo "$key = $val <br>";}/* a = orange b = banana c = apple d = lemon */?> * 4.3 asort() arsort() 根據元素的值對數組排序
<?php$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");asort($fruits);foreach ($fruits as $key => $val){ echo "$key = $val <br>";}/*c = appleb = bananad = lemona = orange */?> * 4.4 natsort() natcasesort() 根據“自然數排序”法對數組排序
<?php$array = array("img12.png", "img10.png", "img2.png", "img1.png");asort($array);echo "<pre>";print_r($array);echo "</pre>";/*Array( [3] => img1.png [1] => img10.png [0] => img12.png [2] => img2.png) */?> * 4.5 usort() uasort() uksort() 根據使用者自訂規則對數組排序
<?phpfunction cmp($a, $b){ if($a == $b){ return 0; } return ($a < $b) ? - 1 : 1;}$a = array(3, 2, 5, 6, 1);usort($a , "cmp");foreach ($a as $key => $value) { echo "$key : $value <br>" ;}/*0 : 11 : 22 : 33 : 54 : 6 */ ?> * 4.6 array_multisort 一次對多個數組進行排序
5. 拆分、合并、分解、接合的數組函數
* 5.1 array_slice() 從數組中取出一段
* 5.2 array_splice() 把數組中的一部分去掉並用其它值取代
* 5.3 array_combine() 建立一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
* 5.4 array_merge() 合并一個或多個數組
* 5.5 array_intersect() 計算數組的交集
* 5.6 array_diff() 計算數組的差集
6. 數組與資料結構的函數
* 6.1 array_push() array_pop() 使用資料實現堆棧
* 6.2 array_unshift() array_shift() unset() 使用隊列
7. 其它與資料操作有關的函數
* 7.1 array_rand() 從數組中隨機取出一個或多個單元
* 7.2 shuffle() 將數組打亂
* 7.3 array_sum() 計算數組中所有值的和
* 7.4 range() 建立一個包含指定範圍單元的數組