在PHP中,存储在数组中的值成为数组元素,数组有一维数组和多维数组之分,每个数组元素的索引也称为关键字,访问数组元素可以通过索引。数组处理函数举例如下:
一.创建数组
1.使用array()函数创建数组:array array([$key=>]$value,...)
$key=>$value,定义了关键字的键名和值,自定义键名可以字符串或数字。如果省略键名,函数会自动产生从0开始的整数作为键名。如果只对某个给出的值没有指定键名,则键名取该值前面最大的整数键名+1后的值。
注意:①可以使用print_r()函数打印数组。print_r()函数语法:bool print_r(mixed expression [,bool return]).如果想捕捉print_r()的输出,可使用return函数,此参数设为true,print_r()将不打印结果,而是返回其输出;
②如果数组定义了两个完全一样的键名,则后面一个会覆盖前面一个;
③要使用数组中某个值,可以使用$array["键名"]的形式;
④可以使用count()和sizeof()函数获取数组元素的个数。
2.使用变量创建数组
compact()函数可以把一个或多个变量,甚至数组,建立成数组元素,这些数组元素的键名就是变量的变量名,值是变量的值:array compact(mixed $varname [,mixed...])
每个$varname可以是一个包括变量名的字符串或者是一个包含变量名的数组。对每个参数,compact()在当前的符号表中查找该变量名并将它添加到输出的数组中,变量名成为键名,变量的内容成为该键的值,任何没有变量名与之对应的字符串都被忽略。
extract()函数可以将数组中的单元(键值)转化为变量。
3.使用两个数组创建一个数组:array_combin()
array array_combin(array $key,array $values)
array_combin()函数用$key数组中的值作为键名,用$values数组中的值作为相应的值,最后返回一个新的数组。
4.建立指定范围的数组:range()
array range(mixed $low,mixed $high [,number $step])
$low为数组开始元素的值,$high为数组结束元素的值。如果$low>$high,则序列将从$high到$low。$step是单元之间的步进值,$step应该为正值,默认为1。range()函数返回一个数组,数组元素的值就是从$low到$high之间的值。
5.还可以自动建立数组。
二.键值操作
1.检查数组中是否存在某个键名和值可以使用array_key_exists()和in_array()函数,两者都为布尔型,存在则返回true,不存在则返回false。
isset()函数也可以用来检查数组中的键名是否存在,但是如果检查的键名对应的值为NULL,isset()函数返回False,而array_key_exists()返回的是true。
2.array_search()函数也可以用于检查数组中的值是否存在,当值存在时返回这个值得键名,若不存在则返回NULL。
3.key()函数可以取得数组当前单元的键名
next()函数返回数组下一个单元的值,并将数组中的内部指针向前移动一位,如果已经到了数组的末端,则返回FALSE,prev()函数是将数组中的内部指针向后移动一位。
end($array):表示将数组中的内部指针指向最后一个单元;
reset($array):表示将数组中的内部指针指向第一个单元,即重置数组的指针;
each($array):表示返回当前的键名和值,并向数组指针向下移动一位。
4.list()函数可以将数组中的值赋给制定的变量。list()函数从数组的第一个值开始依次将值赋给函数中对应的变量,如果变量个数小于数组中的元素个数,则只赋值数组中和变量相等个数的元素。list()函数仅能用于键名为数组的数组并假定数字键名从0开始,如果键名不是连续的数字,则极有可能发生错误。
5.使用array_fill()和array_fill_keys()函数可以用给定的值填充数组的值和键名
array array_fill(int $start_index,int $num,mixed $value)
array_fill()函数用参数$value的值将一个数组从第$start_index个单元开始,填充$num个单元。$num必须是一个大于零的数值,否则PHP会发出一条警告。
array array_fill_keys(array $keys ,mixed $value)
array_fill_keys函数用给定的数组$keys中的值作为键名,$value作为值,并返回新数组。
6.array_filp()函数可以交换数组中的键名和值。
数组中的值必须可作为合法的键名才能够使用该函数进行交换,另外如果交换前数组中有相同的值,则相同的值转换为键名后,值保留最后一个。
7.array_keys()和array_values()可以取得数组中所有的键名和值,并保存到一个新的数组中。
8.array_splice()函数可以将数组中的一个或多个单元删除并用其他值代替
array array_splice(array $input ,int $offset [,int $length[,array $replacement]])
array_splice()函数把$input数组中由$offset和$length指定的单元去掉,如果提供了$replacement参数,则用$replacement中的值替代被移除的单元,最后返回一个包含有被移除单元的数组。
$offset是指定的偏移量,如果$offset为正,则从$input数组中该指定的偏移量开始移除。如果$offset为负,则从$input末尾倒数该值指定的偏移量开始移除。
$length是指定删除的单元数,如果省略$length,则移除数组中从$offset到结尾的所有部分。如果指定了$length并且为正值,则移除$offset后$length个单元,如果指定了$length并且为负值,则移除从$offset到数组末尾倒数$length个为止的所有的单元。当给出了$replacement时要移除从$offset到数组末尾所有单元室,可以用count($input)作为$length。
如果给出了$relpacement数组,则被移除的单元被此数组中的单元替代。如果指定的$offset和$length的组合结果不会移除任何值,则$replacement数组中的单元将被插入到$offset指定的位置。如果用来替换的值只有一个单元,那么不需要给它加上"array",除非该单元本身就是一个数组。
9.array_unique()函数可以移除数组中重复的值,返回一个新的数组,并不会破坏原来的数组。
三.数组的遍历和输出
1.使用while循环访问数组
while循环、list()和each()函数结合就可以实现对数组的遍历。list()函数的作用是将数组中的值赋给变量,each()函数的作用是返回当前的健名和值,并将数组指针向下移动一位。
2.使用for循环访问数组
使用for循环只能访问键名是有序的整型的数组。
3.使用foreach循环访问数组
foreach循环是一个专门用于遍历数组的循环。
foreach (array_expression as $value)
//代码段
foreach(array_expression as $key=>$value)
//代码段
第一种格式遍历给定的array_expression数组。每次循环中,当前单元的值被赋给变量$value并且数组内部的指针向前移一步(下一次循环将会得到下一个单元)。第二种格式做同样的事,只是当前单元的键名也会在每次循环中被赋给变量$key。
四.数组的排序
1.升序
①sort()函数可以对已经定义的数组进行排序,使得数组单元按照数组值从低到高重新索引。
bool sort(array $array [,int $sort_flags])
如果排序成功,返回TRUE,否则返回FALSE。$array是要排序的数组,$sort_flags的值可以影响排序的行为,$sort_flags可以取一下4个值。
SORT_REGULAR:正常比较单元,默认
SORT_NUMERIC:单元被作为数字来比较
SORT_STRING:单元被作为字符串来比较
SORT_LOCAL_STRING:根据当前的区域设置把单元当作字符串比较。
sort()函数不仅对数组进行排序,同时删除了原来的键名,并重新分配自动索引的键名。
②asort()函数也可以对数组的值进行升序排序,使用asort()函数排序后的数组还保持键名和值之间的关联。
③ksort()函数用于对数组的键名进行排序,排序后键名和值的关联不改变。
2.反向
降序排序可使用rsort()、arsort()、krsort()函数。
rsort()函数按数组中的值降序排序,并将数组键名修改为一维数字键名;arsort()函数将数组中的值按降序排序,不改变键名和值之间的关联;krsort()函数将数组中的键名按降序排序。
3.对多维数组排序
array_multisort()函数可以一次对多个数组排序,或根据多维数组的一维或多维对多维数组进行排序。
bool array_multisort(array $ar1[,mixed $arg[,mixed $...[, array $...]]])
第一个参数必须是一个数组,接下来的每个参数可以是数组或者是下面列出的排序标志。
排序顺序标志:
SORT_ASC:默认值,按照升序排序
SORT_DESC:按照降序顺序排序
排序类型标志:
SORT_REGULAR:默认值,按照通常方法比较
SORT_NUMERIC:按照数值比较
SORT_STRING:按照字符串比较
每个数组之后不能制定两个同类的排序标志,每个数组后面制定的排序标志仅对该数组有效。
使用array_multisort()函数排序是字符串键名保持不变,但数字键名会被重新索引。当函数的参数是一个数组列表时,函数首先对数组列表中的第一个数组进行升序排序,下一个数组中值的顺序按照对应的第一个数组的值的顺序排列。
数组列表中所有数组的数组元素一定要相等,否则使用array_multisort()函数时会发出警告。
4.对数组重新排序
shuffle()函数作用是将数组用随机的顺序排列,并删除原有的键名,建立自动索引。
array_reverse()函数是将一个数组单元按相反顺序排序:array array_reverse(array $array [,bool $preserve_keys])如果$preserve_keys的值为TRUE则保留原来的键名,为FALSE则为数组重新建立索引。
5.自然排序
natsort()函数实现了一个和人们通常对字母、数组、字符串进行排序的方法一样的排序算法,并保持原有键/值的关联。称为“自然排序”。natsort()函数对大小写敏感,natcasesort()函数也是一个自然排序函数,但不区分大小写
五.其他
1.合并数组
array_merge()函数可以将一个或多个数组合并,一个数组中的值福建在前一个数组的前面,返回作为结果的数组。
array array_merge(array $array1[,array $array2[,array $...]])
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。如果数组中包含数组键名,后面的值将不会覆盖原来的值,而是附加到后面。如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
在多维数组合并时,array_merge()函数将一维以后的数组都当作一个单元返回。使用array_merge_recusive()函数可以在保持现有数组结构的情况下对数组进行合并。
2.数组的栈操作
栈是一种存储数据的结构,特点是“后进先出”。
出栈操作实际上删除了数组最后一个单元,使用array_pop()函数实现;
入栈操作就是将新单元添加到数组尾部,使用array_push()函数实现,语法格式为:
int array_push(array $array,mixed $var[,mixed $...])
array_push()函数将数组$array当成一个栈,并将传入的变量$var加到$array的末尾,$array的长度将根据入栈变量的数目而增加。
3.取得数组当前单元
current()函数能够获取数组内部指针指向的单元的值,但不移动数组的内部指针。
4.数组计算
使用count()、sizeof()函数可以计算数组中元素的个数,而是用array_count_values()函数可以计算数组中一个值出现的次数。语法格式:
array array_count_values(array $input)
array_count_values()函数返回一个数组,该数组用$input数组中的值作为键名,该值在$input数组中出现的次数作为值。