第5 章 PHP 数组应用 数组(Array)是一组数据的存储空间,这一组存储空间在内存中是相邻接的,每个存 储空间存储了一个数组元素,元素之间使用“键”(key)来识别,通过数组名和键的组合,实 现对数组中每一个元素的访问。本章详细讲解数组的基本概念,以及数组常用的处理函 数,并对数组遍历的几种方法进行比较。 5.1 数组的基本概念 数组由多个元素组成,元素之间相互独立,并使用键来识别,每个元素相当于一个变 量,用来保存数据。因此,可以将数组视为一串内存空间连续的变量组合。 5.1.1 为什么引入数组 使用标量数据类型定义的变量只能存储单个“数据”,仅依靠标量数据类型远不能解 决现实生活中的一些常见问题,例如一个设置个人兴趣爱好的页面,如图5-1所示。 图5-1 设置个人兴趣爱好的页面 从图5-1可以得出以下两点。 (1)用户可选的“兴趣爱好”选项的个数有35项之多,编程过程中不可能为35个“兴 趣爱好”选项,设置35个变量与之对应。 (2)“兴趣爱好”选项的个数以后有可能会继续增加。 为此,需引入数组数据类型以更好地解决上述问题。 第 5 章 PHP 数组应用 125 5.1.2 数组的概念 数组是一组数据的集合,将数据按照一定规则组织起来,形成一个可操作的整体。数 组是对大量数据进行有效组织和管理的手段之一,通过数组函数,可以对大量性质相同的 数据进行存储、排序、插入、删除等操作,从而可以有效地提高程序开发效率,改善程序的 编写方式。 数组的本质是存储、管理和操作一组变量。数组与变量的示意如图5-2所示。 图5- 2 变量与数组 变量中保存的是单个数据,而数组中保存的则是多个变量的集合。使用数组的目的 就是将多个相互关联的数据组织在一起形成一个整体,作为一个单元来使用。 数组中的每个实体都包含两项:键(key)和值(value)。其中,键(也称为数组的下 标)可以是数字、字符串或者数字和字符串的组合,用于标识数组中相应的值;而值被称为 数组中的元素,可以定义为任意数据类型,甚至是混合类型。最终通过键来获取相应的 值。例如,一个足球队通常会有几十人,要认识他们,首先会把他们看作某队的成员,然后 通过他们的号码来区分每一名队员。这时候,球队就是一个数组,而号码就是数组的下标 (键)。当指明几号队员的时候,也就找到了这名队员(值)。 5.1.3 数组的类型 PHP中根据数据的维数将数组分为一维数组、二维数组和多维数组。无论是一维还 是多维,都可以按照键的数据类型, idxday) 统一将数组分为两种:数字索引数组(neera 和关联数组(asociativearay)。数字索引数组使用数字作为键名(图5-2中展示的就是 一个数字索引数组),关联数组则使用字符串作为键名(如图5-3所示)。 图5- 3 关联数组 1.数字索引数组 数字索引数组的下标(键名)由数字(整数)组成,默认从0开始,每个数字对应数组元 素在数组中的位置,不需要特别指定,PHP会自动为数字索引数组的键名赋一个整数值, 然后从这个值开始自动增量。当然,也可以指定从某个具体位置开始保存数据。 数组中的每个实体都包含两项:键名和值。可以通过键名来获取相应数组元素 (值),如果键名是数值,那么就是数字索引数组;如果键名是数值与字符串的混合,那么就 是关联数组。 1 26 PHP 网站开发与设计 声明一个数字索引数组的代码如下: //声明数字索引数组 $arr_int =array ("虚拟现实技术及应用","网站开发与设计","数据库原理及应用基础"); 2.关联数组 关联数组的下标(键名)由数值和字符串混合的形式组成。如果在一个数组中,有一 个键名不是数字,那么这个数组就称为关联数组。 关联数组使用字符串键名来访问存储在数组中的值,如图5-2所示。 声明一个关联索引数组的代码如下: //声明关联数组 $arr_string =array ("PHP"=>"PHP 程序设计","Java"=>"Java 程序设计","C#"= >"C# 程序设计"); 说明:关联数组的键名可以是任何一个整数或字符串。如果键名是一个字符串,则 要给这个键名或索引加上个定界符———单引号(')或双引号(")。对于数字索引数组,为 了避免不必要的麻烦,最好也加上定界符。 5.2 声明数组 PHP中声明数组的规则如下。 (1)数组的名称由一个符号($)开始,第一个字符是字母或下画线,其后是任意数量 的字母、数字或下画线。 (2)在同一个程序中,标量变量和数组变量都不能重名。例如,如果已经存在一个名 为$string的变量,而又创建一个名为$string的数组,那么前一个变量就会被覆盖。 (3)数组的名称区分大小写,如$String与$string是不同的。 声明数组的方法有两种,分别为用户声明和函数声明。下面介绍用户自己创建数组, 以及使用函数直接创建数组。 5.2.1 用户创建数组 在定义数组时,有时不知道需要创建多大的数组,或数组的大小可能会发生变化,这 时就可以使用直接为数组元素赋值的方式来创建数组,其语法格式如下: $arr['key']=value; $arr['0']=value; 其中,key可以是整型或者字符串型数据,value可以是任意数据类型的值。 【例5-1】 应用标识符[]创建数组array,然后应用print_r()函数输出数组元素。 运行结果为: Array ( [0]=>数据库原理及应用基础[1]=>虚拟现实技术及应用[2]= > Office 高级应用 [3]=>网站开发与设计) 说明:本例中使用print_r()函数输出数组元素,因为使用print_r输出数组时,将会 按照一定格式输出数组中所有的键名和元素。使用echo语句则可以输出数组中指定的 某个元素。 注意: (1)用户创建数组,比较适合创建未知大小的数组,或者创建大小可能会发生改变的 数组。 (2)通过标识符[]直接为数组元素赋值时,同一数组元素中的数组名必须相同。 (3)如果数组元素中的键是一个浮点数,则该键将被强制转换为整数(例如浮点数8. 0将被强制转换为整数8);如果键是true或false,则该键将被强制转换为整数1或0。 (4)如果数组元素中的键是一个字符串,且该字符串完全符合整数格式时,则该键将 被强制转换为整数(例如"9"将被强制转换为整数9)。 (5)由于数组元素中的键唯一标识一个元素,因此数组中元素的键不能相等(使用 ==比较)。如果两个数组元素的键相等,则该键对应的值将被覆盖。 (6)不要在array()语言结构中使用诸如“red=>"red"”键值对的方式来创建数组元 素,也不要使用诸如$colors[red]=“red”的赋值语句来创建数组元素,否则程序的可读 性及运行效率将大打折扣。 (7)在直接为数组元素赋值时,键名是可以省略的,下标默认从0开始。 5.2.2 函数创建数组 PHP中创建数组的最常用函数是array(),其语法如下: array array ( [mixed…]) 参数mixed的格式为“key=>value”,多个参数mixed用逗号分开,分别定义键和值。 应用array()函数声明数组时,数组下标(键名)既可以是数字索引也可以是关联索 引。下标与数组元素值之间用“=>”进行连接,不同数组元素之间用逗号进行分隔。 应用array()函数定义数组时,可以在函数体中只给出数组元素值,而不必给出键名。 说明: (1)数组中的索引可以是字符串或数字。如果省略了索引,会自动产生从0开始的 整数索引。如果索引是整数,则下一个产生的索引将是目前最大的整数索引加1。如果 1 28 PHP 网站开发与设计 定义了两个完全相同的索引,则后一个会覆盖前一个。 (2)数组中各数据元素的数据类型可以不同,也可以是数组类型。当mixed是数组 类型时,就是二维数组。 【例5-2】 应用array()函数声明数组,并输出数组中的元素。 'php','two'=>'java'); //以字符串作为数组索引,指定关键字 print_r($arr_string); //通过print_r()函数输出数组 echo "
"; echo $arr_string['one']."
"; //输出数组中的索引为Java 的元素 $arr_int=array('php','java'); //以数字作为数组索引,从0 开始,没有指定关键字 var_dump($arr_int); //输出整个数组 echo "
"; echo $arr_int['0']."
"; //输出数组中的第1 个元素 $arr_key=array (0 =>'数据库原理及应用基础', 1 =>'虚拟现实技术及应用', 1 = > ' Office 高级应用'); //指定相同的索引 print_r($arr_key); //输出整个数组,发现只有两个元素 ?> 运行结果为: Array ( [one]=>php [two]=>java ) php array(2) { [0]=>string(3) "php" [1]=>string(4) "java" } php Array ( [0]=>数据库原理及应用基础[1]=>Office 高级应用) 上述示例的var_dump()函数可以输出数组中每个元素与值的数据类型。从此示例 可以看出,var_dump()函数与print_r()函数用法类似,但var_dump()函数的功能更强 大些。 5.2.3 创建二维数组 上述创建的数组都是只有一列数据内容的,因此称为一维数组。如果将两个一维数 组组合成一个数组,那么就称为二维数组。 【例5-3】 用array()函数创建一个二维数组,并输出数组的结构。 array ("数据库原理及应用基础","大数据技术及应用", "Office 高级应用"),"历史图书"=>array ("1"=>"明朝那些事儿","2"=>"鱼羊野史", 第5 章 PHP 数组应用1 29 "3"=>"从晚清到民国"),"文学图书"=>array ("地平线",3=>"编年史","摇滚记") ); //声明二维数组 print_r ($str) ; / /输 出 数 组 元素 ?> 运行结果为: array ( [计算机类图书]=>array ( [0]=>数据库原理及应用基础[1]=>大数据技术及应用 [2]=>Office 高级应用) [历史图书]=>array ( [1]=>明朝那些事儿[2]=>鱼羊野史[3]=>从晚清到民国) [文学图书]=>array ( [0]=>地平线[3]=>编年史[4]=>摇滚记) ) 5.3 数组遍历与输出 5.3.1 访问数组元素 访问数组元素值的方法和访问变量值的方法相同:通过指定数组名并在方括号内指 定键的方式访问数组元素的值。使用这样的方法访问数组,不仅可以读取某个数组元素 的值,还可以为数组添加数组元素以及修改数组元素的值,并可以像访问变量那样访问数 组元素的值。 【例5-4】 数组元素访问应用。 "red","green"= >"green","white"= >"white","blue" =>"blue"); $colors["black"]="black"; //为数组添加数组元素: "black"=>"black" $colors["red"]="#FF0000"; //修改键为red 的元素值: "red"=>"#FF0000" print_r($colors); echo "
"; if(isset($colors["green"])){ //使用isset()函数判断键为green 的数组元素是否已定义 echo "我喜欢绿色。"; } echo "
"; unset($colors["green"]); //使用unset()函数取消键为green 的数组元素定义 if(!isset($colors["green"])){ echo "我又不喜欢绿色了。"; } echo "
"; echo gettype($colors["blue"]); //使用gettype()函数查看键为blue 的数组元素的数据类型 1 30 PHP 网站开发与设计 echo "
"; var_dump($colors["blue"]); //使用var_dump()函数得到键为blue 的数组元素的数据类型 ?> 运行结果为: array([red]= > # FF0000[green]= > green[white]= > white[blue]= > blue[black]= > black) 我喜欢绿色。 我又不喜欢绿色了。 string string(4)"blue" 上述示例中的unset()函数可以删除整个数组,也可以删除数组的某个元素。 PHP提供两种变量赋值方式:传值赋值和传地址赋值,对于数组同样适用。 【例5-5】 数组传值赋值示例。 "red","green"=>"green","white"=>"white"); $colors2 =$colors1; $colors2["blue"]="blue"; //为数组$colors2 添加元素: "blue"=>"blue" $colors2["red"]="#FF0000"; //修改数组$colors2 键为red 的元素值: "red"=>"#FF0000" print_r($colors1); echo "
"; print_r($colors2); //输出 ?> 运行结果为: array ( [red]=>red [green]=>green [white]=>white ) array ( [red]=>#FF0000 [green]=>green [white]=>white [blue]=>blue ) 【例5-6】 数组传地址赋值示例。 "red","green"=>"green","white"=>"white"); $colors2 =&$colors1; $colors2["blue"]="blue"; //为数组$colors1 和$colors2,添加数组元素: "blue"=>"blue" $colors2["red"]="#FF0000"; //修改数组$colors1 和$colors2 的元素值: "red"=>"#FF0000" print_r($colors1); 第5 章 PHP 数组应用1 31 echo "
"; print_r($colors2); ?> 运行结果为: array ( [red]=>#FF0000 [green]=>green [white]=>white [blue]=>blue ) array ( [red]=>#FF0000 [green]=>green [white]=>white [blue]=>blue ) 5.3.2 数组遍历方式 遍历数组就是按照一定的顺序依次访问数组中的每个元素,直到访问完为止。PHP 可以通过流程控制语句(foreach和for循环语句)和函数(list()和each())来遍历数组。 下面分别介绍这几种遍历数组的方法。 1.通过foreach循环语句遍历数组 在PHP中,foreach循环语句可以很方便地遍历数组,其语法格式如下: foreach ($variable as [$key =>]$value){ 循环体 } 其中,$variable表示需要遍历的数组,as是一个关键字,键变量$key是可选的,值 变量$value 是必需的。每次循环时,foreach 循环语句会把键赋给$key,值赋给 $value。接下来演示通过foreach语句遍历数组,如例5-7所示。 【例5-7】 使用foreach循环语句遍历一维数组$str。 'www.cau.edu.cn', '教育部'=>'www.moe.gov.cn', ); echo "原数组: "; print_r($str); echo "
"; echo "遍历后的值: "; foreach($str as $link){ //遍历数组 echo $link."  "; } ?> 运行结果为: 原数组: array ( [中国农业大学]=>www.cau.edu.cn [教育部]=>www.moe.gov.cn ) 遍历后的值: www.cau.edu.cn www.moe.gov.cn 1 32 PHP 网站开发与设计 上例是将数组的值遍历输出。要将数组的键名和元素值都遍历输出,只需将上例中 的foreach循环语句修改为: foreach($str as $key=>$link){ echo "$key----$link"."
"; //输出数组中的键名和元素值 } 运行结果为: 原数组: array ( [中国农业大学]=>www.cau.edu.cn [教育部]=>www.moe.gov.cn ) 遍历后的值: 中国农业大学----www.cau.edu.cn 教育部----www.moe.gov.cn 此处需注意,$key和$value保存的键与值是通过值传递的方式赋值的。如果使用 引用传递,只需在值变量前加上& 符号即可,但键变量不能写成引用形式。 【例5-8】 遍历二维数组示例。 '主板','price'=>'379','producing'=>'深圳','num'=>3), array('name'=>'显卡','price'=>'799','producing'=>'上海','num'=>2), array('name'=>'硬盘','price'=>'589','producing'=>'北京','num'=>5) ); //商品价格总计 $total =0; //拼接订货单中信息 $str ='

商品订货单

'; $str .=''; $str .=' < td> 商品名称 < td> 单价(元) < td> 产地 < td> 数量 (个)'; //循环数组 foreach($goods as $values){ $str .=''; foreach($values as $v){ $str .=''; } //计算并拼接每件商品的总价格 $sum =$values['price']*$values['num']; $str .=''; $str .=''; //计算订货单中所有商品总价格 $total +=$sum; 第5 章 PHP 数组应用1 33 } $str .='
总价(元)
'.$v.''.$sum.'
小计: < span> '.$total.'元
'; echo $str; ?> 运行结果为: 商品订货单 商品名称 单价(元) 产地 数量(个) 总价(元) 主板 379 深 圳 3 1137 显卡 799 上 海 2 1598 硬盘 589 北 京 5 2945 小计5680 元 2.通过for循环语句遍历数组 如果要遍历的数组是数字索引数组,并且数组的索引值为连续整数时,可以使用for 循环语句来遍历,但前提条件是需要应用count()函数获取数组中元素的数量,然后将获 取的元素数量作为for循环语句执行的条件,才能完成数组的遍历。 【例5-9】 使用for循环语句来遍历数组。 "数据库原理及应用基础", "1"=>"虚拟现实技术及应用", "2"=>"Office 高级应用", "3"=>"网站开发与设计" ); for($i=0;$i"; / /输 出数组元素 } ?> 运行结果为: 数据库原理及应用基础 虚拟现实技术及应用 Office 高级应用 网站开发与设计 3.通过数组函数list()和each()遍历数组 list()与each()函数结合起来也可以遍历数组。接下来分别介绍一下这两个函数。 list()函数将数组中的值赋给一些变量,该函数仅能用于数字索引的数组,且数字索 引从0开始。其语法格式如下: