PHP对数组的处理 | ||||||||||||||||
PHP的一个优势就是提供了丰富的函数,用来处理各种类型的数据、完成一些相对复杂、经常性、重复性多或者和底层有关的操作。这些函数都可以在程序中直接使用。从本章开始,本书就为读者介绍这些PHP内置函数的用法。这一章主要讲述一些和数组处理有关的常用PHP函数。 1 建立数组的方法 在第2章介绍数据类型时,已经介绍过建立数组的方法。本节对建立数组的方法做进一步的说明。使用PHP的array()语言结构可以创建一个数组,如下代码所示。 $ms_office = array(“word”,”excel”,”outlook”,”access”); 上述代码创建了一个名叫$ms_office的数组,它包含4个单元,每个单元存储1个值,这些值是:word、excel、outlook和access,这些值也被称为数组元素。注意,这里的array()不是函数,它只是PHP的语言结构。 数组的索引又叫“键值”或者“下标”。使用“=>”运算符,可以为数组指定索引和值。它的语法格式是:“索引=>值”,每对“索引=>值”之间使用逗号“,”分开。如下代码使用“=>”为数组指定索引和值。 2 输出数组元素的方法 在实际开发中,经常要访问数组的值。如果每次都按数组索引来取数值元素,会非常麻烦。在PHP中可以通过各种循环来快速访问数组元素。本节就介绍常用的for和foreach。 2.1 使用for循环语句输出数组元素 对于一个按整数顺序索引的数组,可以通过for循环语句,来依次访问数组元素, 2.2 使用foreach循环语句输出数组元素 PHP还专门为数组提供了一个循环语句:foreach循环语句,它的语法结构如下所示。 foreach($array as $some_var) { statement } 其中foreach和as都是PHP关键字。该语法结构的含义是:按顺序,每次将数组$array中的一个元素存入变量$some_var后执行statement语句,然后取下一个元素执行statement语句,依次下去,直到所有元素都取到。和for循环语句一样,statement可以是单条语句,也可以是一个语句块。 2.3 使用print_r函数显示数组元素 有时,为了在程序中查看一个数组的结构(即索引和值的对应关系),需要将数组结构显示到页面上。这可以通过PHP的print_r函数实现。 HTML中的“<pre>”和“</pre>”标签,可以把它们之间文本中的空格、回车、换行、tab键表现出来,即按照文本原先的布局显示。在代码4-6中,调用函数print_r之后,也可以加上输出结束标签“</pre>”的代码。 3 计算数组元素个数 在PHP开发中,经常遇到对数组元素个数的计算,通常也称之为计算数组的大小。使用函数count计算数组元素的个数,该函数语法如下所示。该函数的返回值为一整数,即数组元素的个数。 int count(mixed $var); 上述语法格式中的“mixed”表示参数var可以是多种不同的数据类型,这意味着,该函数不仅仅可以用来计算数组元素个数。“mixed”这种表示方法会在本书后续内容中继续使用。 4 对数组进行分割、合并 数组的分割是指将一个数组拆分成一个或多个数组,而数组的合并,可以看成是分割的逆运算,即将多个数组组合成一个新的数组。下面分别介绍和分割、合并数组有关的PHP内置函数。 4.1 实现数组分割 使用函数array_chunk可以对一个数组进行分割,该函数语法如下所示。 array array_chunk(array $input_array, int $size, bool $preserve_key); 该函数接受3个参数,$input_array是将要分割的数组(即原数组),$size表示原数组被分割后,每个数组中元素的个数,$preverse_key是可选参数,它为TRUE时,分割后的每个数组的索引使用原数组的索引名;它为FALSE时,分割后的每个数组的索引都将使用从0开始的整数索引。该函数的返回值是一个数组,这个数组的索引从0开始,该数组的每个元素仍然是一个数组,即原数组被分割后的一个数组。 4.2 实现数组合并 使用函数array_merge可以合并一个或多个数组,该函数的语法如下所示。 array array_merge($array…); 该函数接受一个或多个数组作为参数,PHP5中,它只接受array类型的参数。该函数返回一个合并后的数组。 4.5 处理数组元素和键值位置 PHP的每个数组内部均会有一个指针,指向当前元素。这里所谓的指针,可以把它理解成程序即将要处理的元素所在的位置。处理数组元素和键值(索引)的位置,就是获取数组某个位置上的元素,或获取该元素后,将该指针移动到其他位置。PHP中,处理数组元素和键值位置的函数主要有以下几个。 current:该函数返回数组的当前元素,不移动当前指针位置。 next:该函数返回当前元素的下一个元素的值,并将指针向后移动一位,下一个元素不存在时,返回FALSE。 prev:该函数返回当前元素的上一个元素的值,并将指针向前移动一位,上一个元素不存在时,返回FALSE。 end:该函数返回数组的最后一个元素的值。 4.6 对数组进行排序 对数组排序实际指的是对数组元素的排序。使用PHP的有关内置函数,可以对数组元素按多种方式进行排序,下面分别介绍这些函数的用法。 4.6.1 使用sort对数组进行排序 使用函数sort对数组元素按顺向排序,即按字母由前向后或按数字由小到大排序。该函数的语法如下所示。 bool sort(array &$arr [,int $sort_flag]); 该函数接受一个数组作为输入参数,如果处理成功,该函数返回TRUE,否则,该函数返回FALSE。该函数将会删除所要排序的数组原有的索引值,从而为该数组使用新的索引值。代码4-11演示了如何使用该函数为数组元素排序。 4.6.2 使用rsort对数组进行逆向排序 使用函数rsort对数组元素做逆向排序,即按字母从后到前或按数字由大到小排序。该函数的语法如下所示。 bool rsort(array &$arr [,int $sort_flag]); 该函数接受一个数组作为输入参数,如果处理成功,函数返回TRUE,否则返回FALSE。该函数将会删除所要排序的数组原有的索引值,从而为该数组使用新的索引值。 4.6.3 排序时保持原数组的索引 前面介绍的两个函数sort和rsort,都会为要排序的数组重新建立索引。有时,对数组排序后,仍需要保持原数组的索引,对于这种情况,在PHP中可以使用如下两个函数。 asort:该函数对数组元素进行排序,并且保持数组的原索引关系不变。该函数仍然对数组元素按顺向排序。如果处理成功,该函数返回TRUE,否则返回FALSE。 ksort:该函数对数组元素按索引名顺序排序,并且保持数组的原索引关系不变,如果处理成功该函数返回TRUE,否则返回FALSE。该函数主要用于关联数组。 4.6.4 数组的随机排序 PHP提供一个随机排序数组元素的函数shuffle(),该函数的语法如下所示。 bool shuffle (array $array) 该函数为参数数组$array中的元素赋予新的键名,这将删除原有的键名而不仅仅是重新排序。如果执行成功该函数返回TRUE。 4.6.5 数组的反向排序 本节最后,介绍一个可以将数组元素按原顺序反向排序的函数,该函数是array_reverse()。其语法如下所示。 array array_reverse (array $array [, bool $preserve_keys]) 该函数返回一个与原数组单元顺序相反的数组,原数组以参数$array传入该函数,该函数的第2个参数是可选的,如果第2个参数$preserve_keys设置为TRUE,则原数组的键名将会被保留。 4.7 重置一个数组 PHP中,重置一个数组指的是,将数组中的内部指针移动到该数组的第一个元素所在的单元。使用函数reset可以完成对数组的重置。该函数的语法如下所示。 mixed reset(array &$arr); 该函数接受一个数组类型的变量,将函数内部指针指向数组第一个单元,并将第一个单元的元素返回。如果数组为空,该函数返回FALSE。 4.8 用数组对变量赋值 PHP中,可以将数组的元素作为值赋给变量,使用语言结构list()可以完成这个功能。严格意义上讲,list()和array()一样,不是函数。 在上述程序中,通过list,将数组$planet的第一个元素’Earth’赋给了变量$no1,将第二个元素赋给了变量$no2,将第3个元素赋给了变量$no3。 4.9 快速创建数组 函数range()可以快速创建制定元素范围的数组。其语法如下所示。 array range(mixed $low, mixed $high [, number $step]) 函数range()返回一个数组,其中元素为参数从$low到$high的序列,包括它们本身。例如range(1,9)相当于array(1,2,3,4,5,6,7,8,9),如果$low>$high,则序列将从$high到$low。该函数的第3个参数$step是可选的,如果给出了step的值,它将被作为元素之间的跨度值。step应该为正值。如果未指定,step则默认为1。 4.10 压入和弹出数组元素 这里所说的压入是指,向数组的末尾增加一个元素。而弹出是指,将数组中的最后一个元素取出。PHP提供两个函数分别完成这两个功能,这两个函数是array_push()和array_poo()。 4.10.1 压入数组元素 函数array_push()将一个或多个元素压入数组的末尾,其语法如下所示。 int array_push(array $array, mixed $var) 该函数将参数$array当成一个数据栈,并将传入的参数$var压入$array的末尾。array的长度将根据入栈变量的数目增加,执行正常时,该函数返回数组$array新的单元总数。 4.10.2 弹出数组元素 函数array_pop()将将数组最后一个元素弹出,其语法如下所示。 mixed array_pop(array $array) 该函数弹出并返回参数$array数组的最后一个单元,并将数组$array的长度减一。如果参数$array为空(或者不是数组),该函数将返回 NULL。需要注意的是,使用本函数后会重置数组指针,相当于使用了函数reset()。 4.11 改变数组字符索引名的大小写 PHP提供了一个函数,可以将以字符串作为数组索引(键名)的大小写全部更换,这个函数是array_change_key_case(),该函数的语法如下所示。 array array_change_key_case(array $input [, int $case]) 函数array_change_key_case()将参数$input数组中的所有索引改为全小写或大写。可选参数$case用来指定大小写转换方式,它为两个常量值:CASE_UPPER和CASE_LOWER。没有指定该参数时,该函数使用的默认值是CASE_LOWER。 4.12 对数组的集合处理 函数array_intersect()可以用来计算数组的交集,其语法如下所示。 array array_intersect(array $arr1, array $arr2 [, $arr ...]) 函数array_intersect()返回一个数组,该数组包含了在参数数组$arr1中出现,同时也出现在所有其它参数数组中的值,注意键名保留不变。 4.13 交换数组索引和元素 PHP中的数组可以通过函数实现索引和元素的交换,这对程序实现某些操作带来极大的便利,这个函数就是array_flip(),该函数的语法如下所示。 4.14 快速填充数组元素 PHP提供函数快速填充数组,将数组中的某些或所有元素都置成通一个值,这个函数是array_fill(),其语法如下所示。 array array_fill(int $start, int $num, mixed $value) 函数array_fill()有3个参数:其中参数$start指定要填充元素的开始索引,参数$num表示将$num个数组元素以参数$value填充。 4.15 统计数组元素出现次数 函数cout()用来计算整个数组元素的个数,而函数array_count_values()用来统计数组中各元素出现的次数,即数组中各元素的个数。函数array_count_values()的语法如下所示。 array array_count_values(array $arr) 该函数返回一个数组,这个数组把参数数组$arr中的元素作为索引,元素出现的次数作为对应索引的值。 函数array_count_values()统计出数组$arr中,各个元素出现的次数,而且从这个执行结果可以看出,函数array_count_values()统计元素时,是元素大小写的,比如Say和say会分别被统计。 4.16 检查数组索引是否存在 PHP提供函数array_key_exists()检查给定的索引是否存在于数组中,该函数语法如下所示。 bool array_key_exists(mixed $key, array $search) 该函数查找由参数$key指定的索引,是否存在于由参数$sarch指定的数组中,如果存在,该函数返回TRUE,否则或者出错时,该函数返回FALSE。参数$key可以是任何能作为数组索引的值。 4.17 取得数组中的所有索引 PHP提供函数array_keys()用来获取数组中所有的索引名,该函数语法如下所示。 array array_keys(array $arr [, mixed $search_value [, bool $strict]]) 该函数会将参数数组$arr中,所有的索引名返回到一个数组中。参数search_value是可选的,如果指定该参数,则函数array_keys只返回该元素值对应的索引名,可选参数$strict用来进行全等比较。 4.18 用回调函数处理数组 PHP支持回调函数操作给定数组的元素上,这也是PHP数组函数的强大功能之一。函数array_map()就可以完成这样的工作,它将回调函数作用到给定数组的元素上。其语法如下所示。 array array_map(callback_func, array $arr1 [, array ...]) 函数array_map()返回一个数组,该数组包含了参数$arr1中的所有元素经过函数callback_func处理过之后的元素。callback接受参数的数目应该和传递给array_map()函数的数组数目一致。 4.19 其他数组处理函数 这节介绍两个在实际应用中经常会用到的两个PHP内置函数:in_array()和key()。下面分别加以介绍。 in_array:该函数可以判断某个值是否存在于数组中。如果在数组中找到该值,函数返回TRUE,否则返回FALSE。 key:该函数可以获取数组中当前单元的索引值。 4.19.1 判断某个值是否存在于数组 代码4-30演示了函数in_array的用法。 注意:从该执行结果可以看出,in_array是区分大小写的。“Mars”和“mars”被认为是两个不同的值。 4.19.2 获取数组中当前单元的索引值 代码(详细内容请参照本书)演示了函数key的用法。这段程序首先将当前指针指向数组的最后一个单元,然后通过函数key获取当前元素(即最后一个元素)的索引值。 4.20 小结 本章介绍了对数组进行处理的一些主要的PHP内置函数和语言结构。他们包括: 使用array创建数组。使用for、foreach等循环访问数组元素。使用函数count()计算数组元素个数。使用函数array_chunk()/array_merge()分割/合并数组。处理数组元素和键值位置的函数current()、prev()、next()、end()等。对数组元素排序的函数sort()、rsort()、asort()、ksort()等。使用reset()重置数组。使用list()将数组元素赋值给变量。使用函数shuffle()对数组元素进行随机排序。快速创建数组的函数range()。使用函数array_push()、array_pop()压入和弹出数组元素。 使用函数array_change_key_case()改变字符索引名的大小写。对数组做集合处理的函数array_intersect()、array_intersect_assoc()、 array_diff()和array_diff_assoc()。交换数组索引和元素的函数array_flip()。快速填充数组元素的函数array_fill()。使用函数array_count_values()统计数组元素出现的次数。使用函数array_key_exists()检查索引是否存在。使用函数array_keys()取得数组中的所有索引。使用回调函数处理数组的函数array_map()。使用in_array()检查数组中是否存在某值。使用key()获取数组中当前单元的索引值。本章介绍了较多关于处理数组的PHP函数,读者需要再实践中慢慢掌握这些函数及其用法。
|