Download presentation
Presentation is loading. Please wait.
1
第5章 PHP数组
2
使用标量数据类型定义的变量只能存储单个“数据”,仅依靠标量数据类型远不能解决现实生活中的一些常见问题,例如一个设置个人信息的页面如图所示:
5.1 数组的基本概念 5.1.1 为什么引入数组 使用标量数据类型定义的变量只能存储单个“数据”,仅依靠标量数据类型远不能解决现实生活中的一些常见问题,例如一个设置个人信息的页面如图所示:
3
5.1.2 数组的分类 一维数组 二维数组 多维数组
4
5.2 一维数组的创建 5.2.1 直接将变量声明为数组元素 例如程序createArray2.php 方法一:不指定数组元素的“键”
示例程序:$characters[ ] = "humour"; 方法二:将数组元素的“键”指定为某个整数 示例程序:$interests[2] = "music"; 方法三:将数组元素的“键”指定为某个字符串 示例程序:$colors["red"] = "red"; 例如程序createArray2.php <?php $interests[2] = "music"; $interests[5] = "movie"; $interests[1] = "computer"; $interests[] = "software"; print_r($interests); ?>
5
5.2.2 使用array()语言结构创建数组 PHP提供了array()语言结构创建数组,array()语言结构接受一定数量用逗号分隔的 key => value 参数对,这样可以一次性地为数组添加多个元素(若key省略,则key值为整数)。例如程序createArray4.php。 <?php $colors = array("red"=>"red","green",3=>"white",5); print_r($colors);//输出:Array ( [red] => red [0] => green [3] => white [4] => 5 ) ?>
6
5.2.3 创建数组的注意事项 1.如果“键”是浮点数,则“键”被强制转换为整数(例如浮点数8.0将被强制转换为整数8);如果“键”是TRUE或FALSE,则“键”被强制转换为整数1或0。 2.如果“键”是字符串,且该字符串完全符合整数格式时,数组元素的“键”将被强制转换为整数(例如 "9" 将被强制转换为整数9)。 3.由于“键”唯一标识一个元素,因此数组中元素的“键”不能相等(使用= =比较)。如果两个数组元素的“键”相等,“键”对应的“值”将被覆盖。 4.不要在array() 语言结构中使用“red=>"red"”键值对的方式创建数组元素,也不要使用$colors[red] =“red”的赋值语句创建数组,否则程序的可读性及运行效率将大打折扣。
7
5.2.4 数组元素“值”的访问 访问数组元素值的方法和访问变量值的方法相同:指定数组名并在方括号内指定“键名”的方式“访问”数组元素的“值”。这样不仅可以读取数组元素的“值”,还可以为数组添加数组元素以及修改数组元素的“值”,并可以像访问“变量”的方法访问数组元素的值。 PHP提供两种变量赋值方式:传值赋值和传地址赋值,对于数组同样适用。
8
5.3 二维数组 5.3.1 二维数组的创建 二维数组的创建方法和一维数组的创建方法相同。 方法一:直接将变量声明为二维数组
<?php $students = array( " "=> array("studentNo"=>" ","studentName"=>"张三","studentSex"=>"男"), " "=> array("studentNo"=>" ","studentName"=>"李四","studentSex"=>"女"), " "=> array("studentNo"=>" ","studentName"=>"王五","studentSex"=>"男"), " "=> array("studentNo"=>" ","studentName"=>"马六","studentSex"=>"女") ); print_r($students); ?> 5.3 二维数组 5.3.1 二维数组的创建 二维数组的创建方法和一维数组的创建方法相同。 方法一:直接将变量声明为二维数组 方法二:使用array()语言结构创建二维数组
9
5.3.2 二维数组元素“值”的访问 二维数组中存在两个“键”,因此访问数组元素的“值”时需要指定这两个“键”。例如:$students[" "]["studentName"]对应的值是"张三",其中第一个键" "用于指定二维数组$students中的某一“行”,第二个键"studentName"用于指定二维数组$students的该“行”的某一“列”。 只使用第一个“键”访问数组时,访问的是二维数组中的某一“行”,该行是一个一维数组(例如$students[“ ”]对应的值是数组)。
10
5.4 数组处理函数及应用 5.4.1 快速创建数组的函数 1.range()函数
语法格式:array range(mixed start, mixed end) 函数功能:快速创建一个从start到end范围的数字数组或字符数组。 函数说明:如果 start > end,序列将从 start到 end。 2.explode()函数 语法格式:array explode(string separator, string str); 函数功能:使用指定的字符串分隔符separator分割字符串str,将分割后的字符串放到数组中,并返回该数组。
11
3.array_combine()函数 语法格式:array array_combine ( array keys, array values ) 函数功能:创建一个新数组,用数组keys的值作为新数组的“键”,数组values的值作为新数组的“值”。 4.array_fill()函数 语法格式:array array_fill ( int start_key, int length, mixed value ) 函数功能:创建一个数组,并为该数组添加length个数组元素,数组元素的“键”从start_key处开始递增,每个数组元素的值为value。 说明:length必须是一个大于零的数值,否则 PHP 会提示Warning警告信息。
12
5.array_pad()函数 语法格式:array array_pad ( array arr, int pad_size, mixed pad_value ) 函数功能:array_pad()函数返回数组arr的一个拷贝,并用pad_value 将其填补到 pad_size 指定的长度。如果 pad_size 为正,则数组被填补到右侧,如果为负则从左侧开始填补。如果 pad_size 的绝对值小于或等于 input 数组的长度则没有任何填补。
13
5.4.2 数组统计函数 1.count()函数 语法格式: int count (array arr[, int mode] )
函数功能: 统计并计算数组arr中元素的个数。如果数组arr是多维数组,可将mode 参数的值设为常量COUNT_RECURSIVE(或整数1),计算数组arr中所有元素的个数;mode 的默认值是 0。该函数的别名函数为sizeof()。 2.max()函数 语法格式: mixed max ( array arr [, array ...] ) 函数功能: 统计并计算数组arr中元素的最大值。 说明:PHP 会将非数值的字符串当成0处理,但如果这个正是最大的数值则仍然会返回一个字符串。如果多个数组元素的值为 0 且是最大值,函数会返回其中数值的 0,如果数组元素中没有数值的 0,则返回按字母表顺序最大的字符串。
14
3.min()函数 语法格式: mixed min ( array arr [, array ...] ) 函数功能: 统计并计算数组arr中元素的最小值。 说明:PHP 会将数组arr中的字符串当成 0处理,如果字符串 正是数组arr中最小的数值,则仍然会返回一个字符串;min() 函数返回一个字符串时,该字符串为数组中顺序靠前的字符串。 4.array_sum()函数 语法格式: number array_sum ( array arr) 函数功能: 统计并计算数组arr中的所有元素值的和, array_sum()返回整数或浮点数。 说明:PHP 会将数组arr中的非数值类型的元素值自动类型转 换为整数或浮点数。
15
5.array_product()函数 语法格式: number array_product ( array arr) 函数功能: 统计并计算数组arr中所有元素值的乘积,该函数返回整数或浮点数。 说明:PHP 会将数组arr中的非数值类型的数据自动类型转换为整数或浮点数。 6.array_count_values()函数 语法格式: array array_count_values ( array arr ) 函数功能: 统计并计算数组arr中所有元素的值出现的次数。
16
实训1:数组的遍历 访问数组的所有元素的过程称为数组的遍历,使用数组统计count()函数和for循环语句可以遍历连续整数“键”的数组。例如程序ergodic1.php,该程序的运行结果如图所示。 <?php $chars = range('a','d'); $counts = count($chars); for($key=0;$key<$counts;$key++){ echo $chars[$key]."<br/>"; } ?>
17
5.4.3 数组指针函数 每一个PHP数组在创建之后都会自动建立一个 “内部指针系统”:每个元素有一个“内部指针” (pointer)指向下一个元素;并且“内部指针系统” 会为每一个PHP数组自动建立一个“当前指针” (current)指向数组的第一个元素,图5-24是程序 createArray2.php产生的数组指针结构图。
18
1.key()函数 语法格式:mixed key ( array &arr) 函数功能:返回数组arr“当前指针”所指元素的“键”名。 说明:该函数并不移动“当前指针”,也不会修改数组arr的内部结构。 2.current()函数 语法格式:mixed current ( array &arr) 函数功能:返回数组arr中“当前指针”所指元素的“值”。 说明:current()函数有个别名pos。该函数并不移动“当前指针”,也不会修改数组arr的内部结构。
19
3.next()函数 语法格式:mixed next ( array &arr ) 函数功能:移动数组arr“当前指针”(current),使“当前 指针”(current)指向数组arr的下一个元素;然后返回“当 前指针”(current)所指的元素“值”。 说明:当“当前指针”(current)指向数组的最后一个元素 时,“当前指针”(current)为“空”,并且“当前指针” (current)指向的元素“值”为FALSE。 4.end()函数 语法格式:mixed end ( array &arr ) 函数功能:移动数组arr“当前指针”(current),使“当前 指针”(current)指向数组arr最后一个元素;然后返回“当 前指针”(current)所指的元素“值”。
20
5.prev()函数 语法格式:mixed prev ( array &arr ) 函数功能:移动数组arr“当前指针”(current),使“当前 指针”(current)指向数组arr上一个元素;然后返回“当前 指针”(current)所指的元素“值”。 说明:当“当前指针”(current)为“空”时,“当前指针” (current)还为“空”,并且“当前指针”(current)指向 的元素“值”为FALSE。 6.reset()函数 语法格式:mixed reset ( array &arr ) 函数功能:移动数组arr“当前指针”(current),使“当前 指针”(current)指向数组arr的第一个元素;然后返回“当 前指针”(current)所指的元素“值”。
21
7.each()函数 语法格式:array each (array &arr) 函数功能:以数组形式返回“当前指针”(current)所指的元素(包括“键”和“值”),然后移动数组arr“当前指针”(current),使“当前指针”指向数组arr下一个元素。 说明:该函数返回的数组中共有四个元素(“键值对”),四个元素的“键”名分别为:0,1,key 和 value,“键”名为0 和 key的元素值为arr“当前指针”(current)所指的元素键名,“键”名为1 和 valuey的元素值为arr“当前指针”(current)所指的元素值(见表): 键 值 current-key 1 current-value "key" "value"
22
实训2:非连续“键”的数组遍历 使用next()函数和while循环语句可以遍历非连续“键”的数组。例如程序ergodic2.php:
$colors = array('orange', 'red', 'yellow'); $fruits = array('orange', 'apple', 'banana'); $temp = array_combine($colors, $fruits); reset($temp); do{ $key = key($temp); $value = current($temp); echo $key." ==> ".$value."<br/>"; }while(next($temp)); ?> 实训2:非连续“键”的数组遍历 使用next()函数和while循环语句可以遍历非连续“键”的数组。例如程序ergodic2.php:
23
5.4.4 数组和变量间的转换函数 1.list()语言结构
语法格式:void list ( mixed varname1[, mixed varname2[,mixed ...]]) = array arr; 函数功能:用一步操作给一组变量进行赋值。list()语言结构中定义变量名varname1、varname2等,变量值在数组arr中。 说明:list()语言结构仅用于数字“键”的数组,并要求数字“键”从0 开始连续递增。 2.extract()函数 语法格式:int extract ( array arr ) 函数功能:extract()函数使用数组arr定义一组变量,其中变量名为数组arr元素的键名,变量值为数组arr元素“键”对应的值。
24
3.compact()函数 语法格式:array compact ( mixed varname1[, mixed varname2[,mixed ...]] ) 函数功能:compact()函数返回一个数组,数组每个元素的“键”名为变量名varname1(varname2...),每个数组元素的“值”为变量varname1(varname2...)的值。
25
使用list()语言结构、each()函数和while循环语句可以实现数组的遍历。例如程序ergodic3.php:
$colors = array('orange', 'red', 'yellow'); $fruits = array('orange', 'apple', 'banana'); $temp = array_combine($colors, $fruits); reset($temp); while(list($key,$value) = each($temp)){ echo $key."==>".$value."<br/>"; } ?>
26
5.4.5 数组遍历语言结构 foreach语言结构有两种用法: 1.foreach(array as $value);
每次循环中,“当前指针”所指元素的“值”赋给变量 $value ,然后移动数组array“当前指针”,使“当前指针” 指向下一个元素,周而复始,直至数组array最后一个元素, 此时“当前指针”为空。 2.foreach(array as $key=>$value); 每次循环中,“当前指针”所指元素的“键”名赋给变量$key, “当前指针”所指元素的值赋给变量$value,然后移动数组 array“当前指针”,使“当前指针”指向下一个元素,周而 复始,直至数组array最后一个元素,此时“当前指针”为空。
27
5.4.6 数组检索函数 1.array_keys()函数
语法格式:array array_keys ( array arr [, mixed searchValue ] ) 函数功能:array_keys() 函数以数组的形式返回arr数组中的 “键名”。 如果指定了可选参数searchValue,则只返回 searchValue值的键名;否则arr数组中的所有键名都会被返回。 说明:如果searchValue是字符串,则比较以区分大小写的方 式进行。 2.array_values()函数 语法格式:array array_values ( array arr ) 函数功能:array_values() 函数以数组的形式返回arr数组中 所有的元素值(过滤掉重复的元素值),并为该数组建立连续 的整数“键”。
28
3.in_array()函数 语法格式:bool in_array (mixed searchValue, array arr [, bool strict]) 函数功能:检查数组arr中是否存在值searchValue,如果存在则返回TRUE,否则返回FALSE。如果第三个参数strict的值为TRUE,则in_array() 函数还会检查数据类型是否相同。strict的默认值为FALSE。 说明:如果searchValue是字符串,则比较时区分大小写。 4.array_key_exists()函数 语法格式:bool array_key_exists ( mixed keyName, array arr) 函数功能:检查数组arr中是否存在键名keyName,如果存在则返回TRUE,否则返回FALSE。
29
5.array_search()函数 语法格式:mixed array_search(mixed searchValue, array arr [, bool strict]) 函数功能:在数组arr中搜索给定的值searchValue,如果找到则返回对应的键名,否则返回FALSE。如果第三个参数strict的值为TRUE,则array_search ()函数还会检查数据类型是否相同。strict的默认值为FALSE。 说明:如果searchValue是字符串,则比较时区分大小写;如果searchValue在arr中出现不止一次,则返回第一个匹配的键;要返回所有匹配值的键,应该用array_keys()函数。 6.array_unique()函数 语法格式:array array_unique ( array array ) 函数功能:返回移除数组arr中重复的元素“值”的新数组。 说明:函数保持了原有的“键值对”对应关系,对每个值只保留第一个遇到的键名。
30
5.4.7 数组排序函数 1.sort()函数 语法格式:bool sort ( array &arr )
函数功能:sort()函数按元素“值”的升序(先是数字、然后是标点符号、最后是字母)对数组arr进行排序。如果排序成功则返回TRUE,否则返回FALSE。 说明:sort()函数为排序后的数组arr赋予新的“整数”键名。 2.asort()函数 语法格式:bool asort ( array &arr ) 函数功能:asort()函数按元素“值”的升序(先是数字、然后是标点符号、最后是字母)对数组arr进行排序。如果排序成功则返回TRUE,否则返回FALSE。 说明:数组arr经asort()函数排序后,保持数组元素原有的“键值对”对应关系。
31
3.rsort()函数和arsort()函数
rsort()函数和arsort()函数与sort()函数和rsort()函数是一致的,不同的是rsort()函数和arsort()函数是按降序对数组进行排序。 4.ksort()函数 语法格式:bool ksort ( array & arr) 函数功能:ksort()函数对数组arr按照键名升序排序,并保持数组元素原有的“键值对”对应关系。如果成功则返回TRUE,否则返回FALSE。 5.krsort()函数 语法格式:bool krsort ( array & arr) 函数功能:krsort()函数对数组arr按照键名降序排序,并保持数组元素原有的“键值对”对应关系。如果成功则返回TRUE,否则返回FALSE。
32
6.natsort()函数 语法格式:bool natsort ( array &arr ) 函数功能:用“自然排序”算法对数组arr元素“值”进行升序排序,并保持数组元素原有的“键值对”对应关系不变。 7.natcasesort()函数 语法格式:bool natcasesort ( array &arr ) 函数功能:用“自然排序”算法对数组arr元素“值”进行不区分大小写字母的升序排序,并保持数组元素原有的“键值对”对应关系不变。
33
8.shuffle()函数 语法格式:bool shuffle ( array &arr ) 函数功能:shuffle()函数为数组arr随机排序。 说明:shuffle ()函数将为随机排序后的数组arr赋予新的键名。 9.array_reverse()函数 语法格式:array array_reverse ( array arr [, bool preserve_keys] ) 函数功能:array_reverse()函数返回一个和数组arr元素顺序相反的新数组,如果preserve_keys为TRUE 则保持数组元素原有的“键值对”对应关系不变。
34
5.4.8 数组与数据结构 1.array_push()函数
语法格式:int array_push ( array &arr, mixed var1 [, mixed var2 [, mixed …]] ) 函数功能:array_push()函数将arr当成一个栈,并将参数 var1、var2…分别压入arr的末尾。 2.array_pop()函数 语法格式:mixed array_pop ( array &arr ) 函数功能:array_pop()函数弹出数组arr最后一个元素,并返 回该元素值。如果 array 为空(或者不是数组)将返回NULL。 说明:使用array_pop()函数后会把数组arr的“当前指针”复 位(自动调用reset()函数)。
35
3.array_unshift()函数 语法格式:int array_unshift ( array &arr, mixed var1 [, mixed var2 [, mixed …]] ) 函数功能:将arr当成一个特殊的队列(如图所示),并将参数var2、var1…分别插入arr的队首。该函数返回入队元素的个数。 说明:这个特殊的队列限定在对首插入元素,在队首删除元素。
36
4.array_shift()函数 语法格式:mixed array_shift ( array &arr ) 函数功能:array_shift()函数删除数组arr第一个元素,并返回该元素值。如果array为空(或者不是数组)将返回NULL。 说明:使用array_shift()函数后会把数组arr的“当前指针”复位(自动调用reset()函数)。
37
5.4.9 数组集合运算函数 1.array_merge()函数
语法格式:array array_merge ( array arr1 [, array arr2 [, array ...]] ) 函数功能:将数组arr1、arr2等合并为一个新数组,该函数返回该新数组(集合的并集运算)。多个数组中,如果元素的键名相同,则后面的数组的元素“值”覆盖前面数组的元素“值”。如果数组元素的键名是数字,后面的值将不会覆盖原来的值,而是附加到后面。
38
2.array_diff()函数 语法格式:array array_diff ( array arr1 [, array arr2 [, array ...]] ) 函数功能:array_diff() 函数返回一个新数组,新数组中的元素“值”是所有在 arr1 中,但不在任何其它参数数组中的元素“值”(集合的差集运算)。 3.array_intersect()函数 语法格式:array array_intersect ( array arr1 [, array arr2 [, array ...]] ) 函数功能:array_intersect()函数返回一个新数组,新数组中的元素“值”是即在 arr1数组中,又在arr2等数组中出现的元素“值”(集合的交集运算)。
39
4.array_diff_assoc ()函数
语法格式array array_diff_assoc ( array arr1 [, array arr2 [, array ...]] ) 函数功能:array_diff_assoc () 函数返回一个新数组,新数组中的元素是所有在 arr1 中,但不在任何其它参数数组中的元素(集合的差集运算)。 说明:注意数组元素的键名也用于比较。
40
5.array_intersect_assoc()函数
语法格式:array array_intersect_assoc ( array arr1 [, array arr2 [, array ...]] ) 函数功能:array_intersect_assoc ()函数返回一个新数组,新数组中的元素是即在 arr1数组中,又在arr2等数组中出现的元素(集合的交集运算)。 说明:注意数组元素的键名也用于比较。
41
6.array_diff_key()函数 语法格式:array array_diff_key ( array arr1 [, array arr2 [, array ...]] ) 函数功能:array_diff_key () 函数返回一个新数组,新数组中的元素“键”是所有在 arr1 中,但不在任何其它参数数组中的元素“键”(集合的差集运算)。 7.array_intersect_key()函数 语法格式:array array_intersect_key ( array arr1 [, array arr2 [, array ...]] ) 函数功能:array_intersect_key () 函数返回一个新数组,新数组中的元素“键”是即在 arr1数组中,又在arr2等数组中出现的元素“键”(集合的交集运算)。
Similar presentations