4.1 初识数组
4.1.1 什么是数组
数组是一个可以存储一组或者一系列数值的变量。在PHP中,数组中的元素分两部分,分别为键(Key)和值(Value)。其中,“键”为元素的识别名称,也被称为数组下标,“值”为元素的内容。“键”和“值”存在一种对应关系,称为映射。
1、索引数组
下标为整数的数组,即数组的“键”为整数,仅仅指示元素在数组中的位置,不表示对应值的含义
2、关联数组
下标为字符串的数组,即数组的“键”为字符串,显示时,以元素的添加顺序有关,与下标顺序无关
3、混合数组
数组的“键”既有整数,也有字符串的数组
4.1.2 数组的定义
1、使用赋值方式定义数组
php //**********定义索引数组**********////方式1:$arr1[0]="欧阳华夏";//姓名$arr1[1]=25;//年龄$arr1[2]="男";//性别$arr1[3]=true;//是否单身echo "";print_r($arr1);echo "";/*输出结果:Array([0] => 欧阳华夏[1] => 25[2] => 男[3] => 1)*///方式2:$arr2[]="欧阳华夏";//姓名$arr2[]=25;//年龄$arr2[]="男";//性别$arr2[]=true;//是否单身echo "";print_r($arr2);echo "";/*输出结果:Array([0] => 欧阳华夏[1] => 25[2] => 男[3] => 1)*///方式3$arr3=[0=>"欧阳华夏",1=>25,3=>"男",4=>true];echo "";print_r($arr3);echo "";/*输出结果:Array([0] => 欧阳华夏[1] => 25[2] => 男[3] => 1)*///**********定义关联数组**********////方式4:$arr4["name"]="欧阳华夏";//姓名$arr4["age"]=25;//年龄$arr4["sex"]="男";//性别$arr4["is_Single"]=true;//是否单身echo "";print_r($arr4);echo "";/*输出结果:Array([name] => 欧阳华夏[age] => 25[sex] => 男[is_Single] => 1)*///方式5$arr5=["name"=>"欧阳华夏","age"=>25,"sex"=>"男","is_Single"=>true];echo "";print_r($arr5);echo "";输出结果:/*Array([name] => 欧阳华夏[age] => 25[sex] => 男[is_Single] => 1)*/ ?>
在上述示例代码中,分别定义了索引数组和关联数组
①方式1对应方式4,创建一个数组变量,使用赋值运算符挨个给数组变量赋值
②方式2创建数组,赋值时没有指定“键”,使用默认键,即“键”从0开始
③方式3对应方式5,在一个“[]”中使用“=>”符号给数组赋值
2、使用array()函数定义数组
除了通过赋值方式定义数组外,还可以使用array()函数定义数组,它接收数组的元素作为参数,多个元素之间使用英文逗号分隔;
php //**********定义索引数组**********////方式1$arr1=array("欧阳华夏",28,"男",true); //**********定义关联数组**********//$arr2=array("name"=>"欧阳华夏","age"=>28,"sex"=>"男","is_Single"=>true); ?>
4.1.3 数组元素的获取
获取数组中单个元素的值:
$数组名[键名]
打印数组的全部值:
php /************************方法1********************************/echo "";print_r("数组名")echo ""; /************************方法2********************************/echo "";var_dump("数组名")echo ""; ?>
PHP提供了print_r()函数和var_dump(),专门用于输出数组中的所有元素,需要注意一下几点:
①print_r()函数只能打印出来数组中的元素
②var_dump()函数在打印数组中元素的同时还能打印出元素中值的数据类型
③在上述代码中,都有两行echo "
"代码,其中“pre”标签的作用是用格式化文本输出。4.1.4 删除数组
PHP中提供了unset()函数用于删除数组的元素,使用规则:
①语法: unset(数组名[索引])
②删除元素后数组不会重建该元素的索引。即未被删除的元素的索引不会因为删除了元素而改变
③可以删除整个数组: unset(数组名)
4.1.5 数组操作符
数组这种符合类型的数据可以进行运算,数组的运算通过数组操作数实现。见表4-1:
表4-1 数组操作运算符
运算符 | 含义 | 示例 |
+ | 联合 | $a+$b;$a和$b的联合 |
== | 相等 | $a==$b;如果$a和$b具有相同的键值对,则为true |
=== | 全等 | $a===$b;如果$a和$b具有相同的键值对且顺序和类型都相同则为true |
!= | 不等 | $a!=$b;如果$a不等于$b,则为true |
<> | 不等 | $a<>$b;如果$a不等于$b,则为true |
!== | 不全等 | $a!===$b;如果$a不全等于$b,则为true |
注:”+“为联合运算符,用于合并数组。如果出现下标相同的元素,则保留第一个数组内的元素。
4.2 数组的常见操作
4.2.1 数组指针
对数组中的元素进行访问过程中需要用到数组指针。数组指针用于指向数组中的某个元素,默认情况下指向数组的第一个元素。注意:一个数组只有一个数组指针。具体数组指针见表4-2:
表4-2 数组指针操作函数
函数名 | 作用 |
mixd current(array $array) | 获取数组中当前元素的值,如果内部指针超出数组的末端,则返回false |
mixd key(array $array) | 获取当前元素的键名 |
mixd next(array $array) | 将数组的内部指针向前移动一位 |
mixd prev(array $array) | 将数组的内部指针倒回一位 |
mixd end(array $array) | 将数组的内部指针指向最后一个元素 |
mixd reset(array $array) | 重置指针,即将数组的指针指向第一个元素 |
4.2.2 数组遍历
在PHP中使用foreach语句实现数组的遍历:
无键名遍历
foreach(数组名 as $Value){ //循环体 }
键值对遍历
foreach(数组名 as $Key => $Value){//循环体 }
4.2.3 数组排序----冒泡排序
1 php 2 //********************冒泡排序*******************// 3 $array=[9,8,2,5,3]; 4 /*从小到大 5 冒泡排序思路: 6 1、从第一个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前一个元素比后一个元素大,交换位置,整个 7 过程完成后,数组中最后一个元素就是最大值,这就完成了第一轮比较 8 2、除了最后一个元素,将剩余的元素进行两两比较,过程与第一步相似,这样就可以将数组中第二大的数放在倒数第二个位置 9 3、依次类推,持续对元素进行两两比较,直到没有任何一对元素需要比较为止 10 */ 11 12 for($i=0;$i<count($array)-1;$i++){ 13 //最外层循环,控制比较的轮数,很明显,冒泡排序比较轮数=数组长度-1 14 for($j=0;$j<count($array)-1-$i;$j++){ 15 //里层循环控制相邻的两个数,$j的取值范围要注意,没进行一轮,$j的取值小一次 16 if($array[$j]>$array[$j+1]){ 17 $temp=$array[$j]; 18 $array[$j]=$array[$j+1]; 19 $array[$j+1]=$temp; 20 } 21 } 22 }
4.2.4 数组元素查找
1、顺序查找法----------查找一个数组中是否包含数字8,如果包含,返回当前元素的索引,否则返回“查无此数”;
1 php 2 //定义数组 3 $arr=array(2,3,5,8,9); 4 //定义函数,查找数字8 5 function searchIndex($Array,$Value){ 6 for($i=0;$i){ 7 if($Array[$i]===$Value){ 8 return $i ; 9 } 10 } 11 return "查无此数"; 12 } 13 14 $result=searchIndex($arr,8); 15 echo $result; 16 ?>
2、二分查找法-----查找一个数组中是否包含元素5,如果存在,则输出下标,否则返回“查无此数”
1 php 2 //定义数组, 3 $arr=array(2,3,5,8,9,11,16); 4 //定义函数 5 function binarySearch($Array,$Value,$Start_index,$End_index){ 6 if($Start_index > $End_index){ 7 return "查无此数"; 8 } 9 //获取中间元素下标 10 $Mid_index=round(($Start_index + $End_index)/2); 11 if($Array[$Mid_index] > $Value){ //元素在中间元素的左边 12 //从左边查找 13 binarySearch($Array,$Value,$Start_index,$Mid_index-1); 14 }else if($Array[$Mid_index] < $Value){ //元素在中间元素右边 15 //从右边查找 16 binarySearch($Array,$Value,$Mid_index+1,$End_index); 17 }else{ //查找元素和中间元素值相同 18 echo $Mid_index; 19 } 20 } 21 binarySearch($arr,5,0,count($arr)-1); 22 ?>
4.3 数组的常用函数
4.3.1 基本函数
1、is_array()函数
is_array()函数的作用是判断一个变量是否是一个数组,如果是数组,返回true,否则返回false。
bool is_array(mixed $var);
is_array()函数接受一个mixed类型的变量var,然后判断这个变量是不是数组。
2、count()函数
count()函数的作用是用于计算数组中元素的个数。
int count(mixed $var [,int $mode]);
在上述声明中,count()函数接收两个参数,其中$var参数是必须的,表示传入的数组对象;$mode参数是可选参数,值为0或者1。
$mode=0----->只显示一维数组的个数;
$mode=1----->递归计算多维数组中每个元素的个数;
示例如下:
1 php 2 //一维数组$arr1 3 $arr1=array("百度","新浪","搜狐","网易","传智"); 4 //输出长度 5 echo '一维数组$arr1的长度是:' . count($arr1) . "
"; 6 7 //二维数组 8 $arr2=array( 9 '$arr3'=>array("a","b","c","d","e"), 10 '$arr4'=>array("1","2","3","4","5") 11 ); 12 //输出长度 13 14 //所有元素 15 echo '$arr2的所有元素的个数:' . count($arr2,1) . "
";//计算二维数组中所有元素的个数,12个 16 //一维元素 17 echo '$arr2的一维元素的个数:' . count($arr2) . "
";//计算二维数组中所有一维元素的个数,2个 18 ?>
3、array_unique()函数
array_unique()函数的作用是移出数组中的重复元素。
array array_unique(array $array);
在上述声明中,array_unique()函数接受一个数组,去除重复元素后返回一个新的数组。在使用该函数时,首先将数组元素的值作为字符串排序,然后对每个值只保留第一个键名,忽略后面所有的键名。
1 php 2 $input=array("a"=>"green","red","b"=>"green","blue","red"); 3 echo ""; 4 print_r($input); 5 //调用函数 6 $result=array_unique($input); 7 print_r($result); 8 echo ""; 9 10 /*运行结果 11 Array 12 ( 13 [a] => green 14 [0] => red 15 [b] => green 16 [1] => blue 17 [2] => red 18 ) 19 Array 20 ( 21 [a] => green 22 [0] => red 23 [1] => blue 24 ) 25 */ 26 ?>
4.3.2 键值对的相关函数
1、array_search()
array_search()函数用于获取数组中元素对应的键名。
array array_search(mixed $needle,array $haystack [,bool $strict]);
在上述声明中,$needle表示在数组中要查找的值,$haystack表示被查询的数组。$strict参数是可选的,当值为true时,就会在$haystack数组中检查$needle的类型。
1 php 2 $array=array(0=>"blue",1=>"red",2=>"green",3=>"red"); 3 echo "green对应的键为:"; 4 echo array_search("green",$array); 5 //结果:green对应的键为:2 6 ?>
当被查询的元素在数组中出现两次以上时,那么array_search()函数返回第一个匹配的键名。
2、array_keys()函数
array_keys()函数同样用于获取数组中元素对应的键名。不同的是,array_keys()函数可以返回所有匹配的键名。
array array_keys(array $input [,mixed $search_value [,bool $strict]]);
上述声明中,$input表示要被查询的数组;$search_value参数是可选参数,当给$search_value赋值时,函数返回该值的键名,否则返回$input数组的所有的键名。$strict参数用来进行全等比较,需要传入一个布尔值,默认为false,如果为true则根据类型返回带有指定值的键名。
1 php 2 //定义数组arr1 3 $arr1=array(0=>"ttg","name"=>"dandy"); 4 print_r(array_keys($arr1)); //返回数组中元素的所有键名 5 //Array ( [0] => 0 [1] => name ) 6 print_r(array_keys($arr1,"dandy")); //获取数组元素为"dandy"对应的键名 7 // Array ( [0] => name ) 8 9 //定义数组arr2 10 $arr2=array(11,12,32,"11"); 11 print_r(array_keys($arr2,11)); //获取元素11(不依赖类型) 12 //Array ( [0] => 0 [1] => 3 ) 13 print_r(array_keys($arr2,"11",true)); //获取字符串类型的元素的"11" 14 // Array ( [0] => 3 ) 15 ?>
array_keys()函数可以根据传入的参数,返回不同的键名。当传入的参数是一个数组时,则返回所有的键。当传入一个指定数组中某个元素时,返回该元素对应的键。
4.3.3 排序函数
PHP提供了多个排序的函数,例如sort()函数、rsort()函数、ksort()函数等。
以sort()函数为例,讲解数组的排序功能。sort()函数的作用就是对数组中的元素按照从小到大的顺序进行排序。
bool sort(array $array [,int $sort_flag=sort_regular]);
在上面的声明中,$array参数表示需要排序的数组,$sort_flag是可选参数,sort()函数会根据$sort_flag的值改变数组的排序方式。$sort_flag的取值如表4-3所示:
表4-3 $sort_flag的取值范围
取值范围 | 排序方式 |
SORT_REGULAR | 默认值,将自动识别数组元素的类型进行排序 |
SORT_NUMERIC | 用于数字元素的排序 |
SORT_STRING | 用于字符串元素的排序 |
SORT_LOCALE_STRING | 跟去当前local设置来把元素当作字符串比较 |
示例代码:
php$arr=array("4apple","3banana","1orange","2peach");sort($arr,SORT_NUMERIC);echo "";print_r($arr);echo "";/*运行结果:Array([0] => 1orange[1] => 2peach[2] => 3banana[3] => 4apple)*/ ?>
4.3.4 合并和拆分函数
1、array_merge()函数
array_merge()函数的作用是合并一个或多个数组。
array array_merge(array $array1 [,array $...]);
array_merge()将一个或者多个数组的单元合并起来,一个数组的值附加在另一个数组的后面,返回一个新的数组。
①如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前面的值;
②如果数组中包含数字键名,后面的值不会覆盖原来的值,而是附加在数组的后面;
③如果数组是数字索引的,则键名会以连续方式重新编排索引。
1 php 2 $array1=array("color"=>"red",2,4); 3 $array2=array("a","b","color"=>"green","shape"=>"trapezoid",4); 4 $result=array_merge($array1,$array2); 5 echo ""; 6 print_r($result); 7 echo ""; 8 9 /*运行结果: 10 Array 11 ( 12 [color] => green 13 [0] => 2 14 [1] => 4 15 [2] => a 16 [3] => b 17 [shape] => trapezoid 18 [4] => 4 19 ) 20 */ 21 ?>
2、array_chunk()函数
函数array_chunk()的作用是将一个数组分割成多个数组。
array array_chunk(array $input,int $size [,bool $preserve_keys]);
上述声明中,$input表示要分割的数组,$size是分割后每个数组中元素的个数,$preserve_keys是一个可选参数。如果将该参数设置为true,则分割后的数组中元素保留原来的索引,如果将该参数设置为false,则分割后数组中的元素的索引将从零开始。
代码如下:
1 php 2 $arr=array("cctv-a","cctv-b","cctv-c"); 3 //分割数组 4 echo ""; 5 echo "分割后的数组为:" . ""; 8 /*运行结果: 9 分割后的数组为: 10 Array 11 ( 12 [0] => Array 13 ( 14 [0] => cctv-a 15 [1] => cctv-b 16 ) 17 18 [1] => Array 19 ( 20 [0] => cctv-c 21 ) 22 23 ) 24 */ 25 26 //第二次分割 27 echo "
"; 6 print_r(array_chunk($arr,2)); 7 echo ""; 28 echo "分割后的数组为:" . ""; 31 /*运行结果: 32 分割后的数组为: 33 Array 34 ( 35 [0] => Array 36 ( 37 [0] => cctv-a 38 [1] => cctv-b 39 ) 40 41 [1] => Array 42 ( 43 [2] => cctv-c 44 ) 45 46 ) 47 */ 48 ?>
"; 29 print_r(array_chunk($arr,2,true)); 30 echo "
4.3.5 其他函数
1、array_rand()函数
array_rand()函数的作用是从数组中随机取出一个或多个元素。
mixed array_rand(array $input [,int $num_req]);
array_rand()函数接受一个input参数和一个可选的参数num_req,其中input参数用于指定接受的数组,num_req用于指定取出元素的个数,默认为1。如果只取出一个元素,array_rand()会返回一个随机元素的键名,否则返回一个包含随机键名的数组。
代码如下:
1 php 2 $input=array("科比","姚明","詹姆斯","艾佛森","基德"); 3 echo ""; 4 echo "随机获取一个元素" . ""; 10 11 /*运行结果: 12 随机获取一个元素 13 2 14 随机获取两个元素 15 Array 16 ( 17 [0] => 2 18 [1] => 3 19 ) 20 */ 21 ?>
"; 5 print_r(array_rand($input)); 6 echo "
"; 7 echo "随机获取两个元素" . "
" ; 8 print_r(array_rand($input,2)); 9 echo "
2、array_reverse()
array_reverse()函数的作用是返回一个元素顺序相反的数组。
array array_reverse(array $array [,bool $preserve_keys]);
array_reverse()接受数组array作为输入并返回一个元素为相反顺序的新数组,如果preserve_keys为true,则保留原来的键名。
代码如下:
1 php 2 $input=array("ibim",122,array("dell","apple")); 3 $result=array_reverse($input); 4 echo ""; 5 print_r($result); 6 echo ""; 7 /*运行结果: 8 Array 9 ( 10 [0] => Array 11 ( 12 [0] => dell 13 [1] => apple 14 ) 15 16 [1] => 122 17 [2] => ibim 18 ) 19 键名被修改 20 */ 21 $result_keyed=array_reverse($input,true); 22 echo ""; 23 print_r($result_keyed); 24 echo ""; 25 /*运行结果: 26 Array 27 ( 28 [2] => Array 29 ( 30 [0] => dell 31 [1] => apple 32 ) 33 34 [1] => 122 35 [0] => ibim 36 ) 37 键名保留不会修改 38 */ 39 ?>