6.4 数组
计算机可以执行重复工作,可以处理大量数据,但到现在也只能定义极少量的数据,如想定义成千上万个数据,是否需要写出成千上万的句子?此时,应该定义数组来定义大量的数据。数组和变量都是用来存放数据的,但数组虽然只有一个名称,却可以用来存放多个数据。数组所存放数据的每一个成员叫作元素,每个元素都有各自的值,也就是所保存的数据。数组有多个元素,区分数组每一个元素依靠索引,数据每个元素都有自身的索引。数组元素的索引从0开始,也就是数组第一个元素的索引为0,第二个元素的索引为1 ,以此类推。当数组的元素个数为n时,数组的长度就为n。除了一维数组外,PHP还允许使用多维数组。
6.4.1 数组的定义
数组本身也是变量,命名规则和写法同其他变量。组成数组的元素可以是PHP所支持的任何数据类型,如字符串、布尔值等。在PHP中声明数组的方式主要有以下两种。
1.使用array()来声明数组
语法如下:
array( [key =>] value , [key =>] value , … );
其中:
(1)key是数组元素的“键”或者“下标”,可以是integer或者string。
(2)key如果是浮点数将被取整为integer。
(3)value是数组元素的值,可以是任何值,当value为数组时则构成多维数组。
(4)可以忽略[key =>]部分,默认为索引数组,索引值从0开始。
6-31.php
<?php $my_array=array('北京','纽约','东京'); foreach($my_array as $key=>$value) { echo '$my_array['.$key.']'.'='.$value."<br/>"; } $arr=array('China'=>'北京','USA'=>'纽约','Japan'=>'东京'); echo "---------------------------------------------<br/>"; foreach($arr as $key=>$value) { echo '$arr['.$key.']'.'='.$value."<br/>"; } ?>
运行结果如图6-25所示。
2.直接为数组元素赋值
语法如下。
$数组名[索引值] = 元素值;
其中:
(1)索引值可以是整数或字符串,若为数字,可以从任意数字开始。
(2)元素值可以为任何值,当元素值为数组时则构成多维数组。
6-32.php
<?php $my_array["河北"]="石家庄"; $my_array["山东"]="济南"; foreach($my_array as $key=>$value) { echo '$my_array['.$key.']'.'='.$value."<br/>"; } echo "-------------------------------------------------<br/>"; for ($i=0;$i<10;$i++) { $arr[$i]=$i; } foreach($arr as $key=>$value) { echo '$arr['.$key.']'.'='.$value."<br/>"; } ?>
运行效果如图6-26所示。
6.4.2 数组的操作
数组由于其灵活性和方便性,在编程中被反复使用,PHP中和数组相关的函数也有很多,下面介绍一些数组常用的操作函数。
1.统计数组元素个数
在PHP中,可以使用count()函数对数组中的元素个数进行统计。语法形式如下:
int count ( mixed var [, int mode] )
其中,参数var为必要参数;如果可选的mode参数设为COUNT_RECURSIVE(或1),count()将递归地对数组计数,这在计算多维数组的所有单元时有用,mode的默认值是0。
6-33.php
<?php $arr=array(5,6,7,8,9,2,1); echo '$arr的长度:'.count($arr); ?>
运行效果如图6-27所示。
2.数组与字符串的转换
数组与字符串的转换在程序开发过程中经常使用,主要使用explode()和implode()函数来实现。
(1)使用一个字符串分割另一个字符串——explode()函数。
语法形式如下。
array explode ( string separator, string string [, int limit] )
此函数返回由字符串组成的数组,字符串string被字符串separator作为边界分割出若干个子串,这些子串构成一个数组。如果设置了limit参数,则返回的数组包含最多limit个元素,而最后那个元素将包含string的剩余部分。
6-34.php
<?php $str="河北,山东,河南,山西"; $arr=explode(",",$str); foreach($arr as $key=>$value) { echo '$arr['.$key.']'.'='.$value."<br/>"; } ?>
运行效果如图6-28所示。
(2)将数组元素连接为一个字符串——implode()函数。
语法形式如下。
string implode ( string glue, array pieces )
把pieces的数组元素使用glue指定的字符串作为间隔符连成一个字符串。
6-35.php
<?php $my_array=array('北京','纽约','东京'); $str=implode(".",$my_array); echo $str; ?>
运行效果如图6-29所示。
3.数组的查找
在数组中查找某个索引值或者元素是否存在,可以遍历数组进行查找,也可以使用PHP提供的函数,查找起来更为方便。
(1)检查数组中是否存在某个值——in_array()函数。
语法形式如下。
bool in_array ( mixed needle, array haystack [, bool strict] )
在haystack中搜索needle,如果找到则返回true,否则返回false。如果第三个参数strict的值为true,则in_array()函数还会检查needle的类型是否和haystack中的相同。
(2)在数组中搜索给定的值——array_search ()函数。
语法形式如下。
mixed array_search ( mixed needle, array haystack [, bool strict] )
在haystack中搜索needle参数并在找到的情况下返回索引值,否则返回false。如果第三个参数strict的值为true,则array_search函数还会检查needle的类型是否和haystack中的相同。
该函数和in_array()的不同之处在于needle如果找到,返回值不同。
(3)检查给定的键名或索引是否存在于数组中——array_key_exists()函数。
语法形式如下。
bool array_key_exists ( mixed key, array search )
在search中搜索是否存在为key的键名或索引,如果找到则返回true,否则返回false。
6-36.php
<?php $my_array=array('China'=>'北京','USA'=>'纽约','Japan'=>'东京'); var_dump (in_array('北京',$my_array)); echo "<br/>"; var_dump (in_array('北',$my_array)); echo "<br/>"; var_dump (array_search('北京',$my_array)); echo "<br/>"; var_dump (array_search('北',$my_array)); echo "<br/>"; var_dump (array_key_exists('China',$my_array)); echo "<br/>"; var_dump (array_key_exists(4,$my_array)); echo "<br/>"; ?>
运行结果如图6-30所示。
4.数组的排序
对于数组而言,常用的操作除了遍历和查找外,另一个比较重要的操作就是排序了。下面介绍三个比较重要且常用的对数组进行排序的函数。
(1)对数组进行升序排序——sort()函数。
语法形式如下。
bool sort ( array &array [, int sort_flags] )
可选第二个参数sort_flags可以用以下值改变排序的行为。
① SORT_REGULAR:正常比较元素(不改变类型)。
② SORT_NUMERIC:元素被作为数字来比较。
③ SORT_STRING:元素被作为字符串来比较。
④ SORT_LOCALE_STRING:根据当前的locale设置来把元素当作字符串比较。
6-37.php
<?php $arr=array(2,3,7,1,8,9); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; } echo "<br/>排序后-----------------------------------------<br/>"; sort($arr); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; } ?>
运行效果如图6-31所示。
(2)对数组进行降序排序——rsort ()函数。
语法形式如下。
bool rsort ( array &array [, int sort_flags] )
6-38.php
<?php $arr=array(2,3,7,1,8,9); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; } echo "<br/>排序后-----------------------------------------<br/>"; rsort($arr); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; } ?>
运行效果如图6-32所示。
(3)对关联数组排序——ksort()和asort()函数。
关联数组的键名是字符串,也可以是数值和字符串混合的形式。在一个数组中只要有一个索引值不是数字,那么这个数组就称为关联数组。如果使用关联数组,在排序后还需要保持键和值的排序一致,这时就需要使用ksort()和asort()函数。语法形式如下。
bool asort ( array &array [, int sort_flags] )
对数组进行排序并保持索引关系。
bool ksort ( array &array [, int sort_flags] )
对数组按照索引值排序。
6-39.php
<?php $arr=array('C'=>'China','U'=>'USA','J'=>'Japan'); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; //0=>this 1=>is 2=>an 3=>example } echo "<br/>排序后-----------------------------------------<br/>"; asort($arr); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; //0=>this 1=>is 2=>an 3=>example } ?>
运行效果如图6-33所示。
6-40.php
<?php $arr=array('China'=>'北京','USA'=>'纽约','Japan'=>'东京'); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; //0=>this 1=>is 2=>an 3=>example } echo "<br/>排序后-----------------------------------------<br/>"; ksort($arr); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; //0=>this 1=>is 2=>an 3=>example } ?>
运行效果如图6-34所示。
5.数组的拆分与合并
在PHP开发过程中,还会经常用到将两个数组合并为一个或者取出数组中的某一部分构成一个新的数组,这时可以使用数组的拆分与合并函数。
(1)从数组中取出一段——array_slice()函数。
语法形式如下。
array array_slice ( array array, int offset [, int length [, bool preserve_keys]] )
返回根据offset和length参数所指定的array数组中的一段序列。$offset为获取数组子集开始的位置;如果为负,则将从数组$array中距离末端这么远的地方开始。可选参数length为获取子元素的个数,如果length为负,则将终止在距离数组$array末端这么远的地方。如果省略,则序列将从offset开始一直到array的末端。
array_slice()默认将重置数组的键。自PHP 5.0.2起,可以通过将preserve_keys设为true来改变此行为。
6-41.php
<?php $arr=array('China'=>'北京','USA'=>'纽约','Japan'=>'东京'); $arr=array_slice($arr,1,1); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; } ?>
运行效果如图6-35所示。
(2)把数组中的一部分去掉并用其他值取代——array_splice()函数。
语法形式如下。
array array_splice ( array &input, int offset [, int length [, array replacement]] )
array_splice()把input数组中由offset和length指定的单元去掉,如果提供了replacement参数,则用replacement数组中的单元取代。返回一个包含被移除单元的数组。其中,input中的数字键名不被保留。
如果要使用replacement来替换从offset到数组末尾的所有元素时,可以用count($input)作为length。
6-42.php
<?php $arr=array('China'=>'北京','USA'=>'纽约','Japan'=>'东京'); $s_arr=array_splice($arr,1,1); foreach($arr as $key=>$value) { echo $key . "=>" . $value." "; } echo "<br/>--------------------<br/>"; foreach($s_arr as $key=>$value) { echo $key . "=>" . $value." "; } ?>
运行效果如图6-36所示。