一、数组概述
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]; // lisi echo '<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 =====> 1 name =====> zhasna age =====> 40 100 =====> nan 101 =====> aaa@bb.com */ foreach($user as $val){ // 不要key也能够, 直接遍历$user的值 echo $val."<br>"; } /* 1 zhasna 40 nan aaa@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 ----> 1 name ----> zhangsan age ----> 10 sex ----> nan */ ?>
list() 函数:
* list()=array(); 须要将一个数组赋值给这个函数
* 数组中的元素个数要和list()函数中的參数个数同样
* 数组中的每一个元素值会赋值给list()函数中的每一个參数,list()将每一个參数转为变量
* list()仅仅能接收索引数组
<?php list($name, $age, $sex) = array("zansan", 10, "nnnnn"); echo $name."<br>"; echo $age."<br>"; // list中的值和数组中的值一一相应 echo $sex."<br>"; // 假设不想给name赋值, 那就写成list(, $age, $sex) /* zansan 10 nnnnn */ $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 ==> zhangsan age ==> 10 sex ==> nan */ ?>
五、提前定义数组
自己主动全局变量 -- 超全局数组
1. 包括了来自WEBserver,client,执行环境和用户输入的数据
2. 提前定义数组在全局范围内自己主动生效,比如在函数中不用声明global也能够使用这些数组
3. 用户不能自己定义这些数组, 但这些数据操作方式又和我们自己定义的数组操作方式一样
* $_GET // 经由URL请求提交至脚本的变量
* $_POST // 经由HTTP POST方法提交到脚本的变量
* $_REQUEST // 经由GET, POST和COOKIE机制提交到脚本的变量,因此该数组并不值得信任,尽量不去使用
* $_FILES // 经由HTTP POST 文件上传而提交至脚本的变量
* $_COOKIE //
* $_SESSION //
* $_ENV // 运行环境提交至脚本的变量
* $_SERVER // 变量由WEBserver设定的,或直接和当前脚本的运行环境相关联
* $GLOBALS // 仅仅要是当前脚本有效的变量都在这里,数组键名为全局变量的名称
<?php print_r($_GET); echo $_GET["username"]."<br>"; // 获取get方式url中的username print_r($_POST); echo $_POST["uname"]."<br>"; // 获取post方式表单提交的uname print_r($_REQUEST); echo $_ENV["OS"]."<br>"; // 获取key为'OS'的value echo $_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() 用回调函数过滤数组中的单元
<?php function odd($var) { // returns whether the input integer is odd return ($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 /> "; } array_walk($fruits, 'test_print'); /* d => lemon a => orange b => banana c => apple */ ?>
* 3.3 array_map() 将回调函数作用到给定数组的单元上
<?php function 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] = apple fruits[1] = banana fruits[2] = lemon fruits[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 = apple b = banana d = lemon a = 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() 依据用户自己定义规则对数组排序
<?php function 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 : 1 1 : 2 2 : 3 3 : 5 4 : 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() 建立一个包括指定范围单元的数组