5.4 数组处理函数及应用
PHP数组的功能非常强大,其中一个原因与PHP提供丰富且功能强大的数组处理函数密不可分。PHP提供了近百个数组处理函数,为了便于学习PHP数组处理函数,按照数组函数的不同功能,将数组处理函数分为10类,如表5-2所示。
数组处理函数的参数为数组类型参数时,若是传值赋值,则函数不会影响到数组的内部结构,例如foreach语言结构、数组统计函数等;若是传地址赋值,有可能会影响到数组的内部结构(例如数组元素发生变化或数组的“当前指针”发生变化),例如数组指针函数(current和key除外)、排序函数等。
5.4.1 快速创建数组的函数
PHP 提供的快速创建数组的函数包括:range()、explode()、array_combine()、array_fill()和array_pad()。
1.range()函数
语法格式:array range(mixed start, mixed end)
函数功能:快速创建一个从start到end范围的数字数组或字符数组。
函数说明:如果 start > end,序列将从 start降序到end。
例如,程序range.php如下。
<?php
$numbers = range(1,5); //等价于$numbers = array(1,2,3,4,5)
print_r($numbers); //输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
echo "<br/>";
$chars1 = range('a','d'); //等价于$ chars1 = array('a','b','c','d')
print_r($chars1); //输出:Array ( [0] => a [1] => b [2] => c [3] => d )
echo "<br/>";
$chars2 = range('d','a'); //等价于$ chars2 = array('d','c','b','a')
print_r($chars2); //输出:Array ( [0] => d [1] => c [2] => b [3] => a )
?>
2.explode()函数
语法格式:array explode(string separator, string str);
函数功能:使用指定的字符串分隔符separator分割字符串str,将分割后的字符串放到数组中,并返回该数组。例如,程序explode.php如下。
<?php
$ip = "127.0.0.1";
$exploded = explode(".",$ip);
print_r($exploded); //输出:Array ( [0] => 127 [1] => 0 [2] => 0 [3] => 1 )
?>
3.array_combine()函数
语法格式:array array_combine ( array keys, array values )
函数功能:创建一个新数组,用数组keys的值作为新数组的“键”,数组values的值作为新数组的“值”。例如,程序array_combine.php如下。
<?php
$colors = array('orange', 'red', 'yellow');
$fruits = array('orange', 'apple', 'banana');
$temp = array_combine($colors, $fruits);
print_r($temp); //输出:Array ( [orange] => orange [red] => apple [yellow] => banana )
?>
4.array_fill()函数
语法格式:array array_fill ( int start_key, int length, mixed value )
函数功能:创建一个数组,并为该数组添加length个数组元素,数组元素的“键”从start_key处开始递增,每个数组元素的值为value。
说明:length必须是一个大于零的数值,否则PHP会提示Warning警告信息。
例如,程序array_fill.php如下。
<?php
$bananas = array_fill(5,3,'banana');
print_r($bananas);
$oranges = array_fill(2,-1,'orange');
print_r($oranges);
?>
程序array_fill.php的运行结果如图5-15所示。
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的绝对值小于或等于arr数组的长度,则没有任何填补。例如,程序array_pad.php如下。
<?php
$info = array('coffee', 'brown', 'caffeine');
$tea1 = array_pad($info, 5, 'tea');
$tea2 = array_pad($info, -7, 'tea');
$tea3 = array_pad($info, 2, 'tea');
print_r($tea1);/*输出:Array ( [0] => coffee [1] => brown [2] => caffeine [3] => tea [4] => tea ) */
echo "<br/>";
print_r($tea2); /*输出:Array ( [0] => tea [1] => tea [2] => tea [3] => tea [4] => coffee [5] => brown [6] => caffeine )*/
echo "<br/>";
print_r($tea3); /*输出:Array ( [0] => coffee [1] => brown [2] => caffeine ) */
?>
5.4.2 数组统计函数
数组统计函数是指统计数组各元素的值,并对这些值进行简单分析。
1.count()函数
语法格式:int count (array arr[, int mode] )
函数功能:统计并计算数组arr中元素的个数。如果数组arr是多维数组,可将mode参数的值设为常量COUNT_RECURSIVE(或整数1),计算数组arr中所有元素的个数;mode 的默认值是0。
说明:该函数的别名函数为sizeof()。
例如,程序count.php如下。
<?php
$colors = array("red"=>"red","green",3=>"white",5);
$students = array(
"2010001"=>
array("studentNo"=>"2010001","studentName"=>"张三","studentSex"=>"男"),
"2010002"=>
array("studentNo"=>"2010002","studentName"=>"李四","studentSex"=>"女"),
"2010003"=>
array("studentNo"=>"2010003","studentName"=>"王五","studentSex"=>"男"),
"2010004"=>
array("studentNo"=>"2010004","studentName"=>"马六","studentSex"=>"女")
);
$countColors = count($colors);
$countstudents = count($students,1);
var_dump($countColors); //输出:int(4)
echo "<br/>";
var_dump($countstudents); //输出:int(16)
?>
2.max()函数
语法格式:mixed max ( array arr [, array…] )
函数功能:统计并计算数组arr中元素的最大值。
说明:PHP会将非数值的字符串当成0处理,但如果这正是最大的数值,则仍然会返回该字符串。如果多个数组元素的值为0且是最大值,函数会返回其中数值的0,如果数组元素中没有数值的0,测返回按字母表顺序最大的字符串。
例如,程序max.php如下。
<?php
$scores = array(70,80,90,60);
$grades = array('A','B','C','D');
$maxScores = max($scores);
$maxGrades = max($grades);
var_dump($maxScores); //输出:int(90)
echo "<br/>";
var_dump($maxGrades); //输出:string(1) "D"
?>
3.min()函数
语法格式: mixed min ( array arr [, array …] )
函数功能: 统计并计算数组arr中元素的最小值。
说明:PHP 会将非数值的字符串当成 0 处理,但如果这正是最小的数值,则仍然会返回该字符串。如果多个数组元素的值为0且是最小值,函数会返回按字母表顺序最小的字符串,如果其中没有字符串,则返回数值0。
例如,程序min.php如下。
<?php
$scores = array(70,80,90,60);
$grades = array('A','B','C','D');
$minScores = min($scores);
$minGrades = min($grades);
var_dump($minScores); //输出:int(60)
echo "<br/>";
var_dump($minGrades); //输出:string(1) "A"
?>
4.array_sum()函数
语法格式: number array_sum ( array arr )
函数功能: 统计并计算数组arr中的所有元素值的和,array_sum()返回整数或浮点数。
说明:PHP 会自动将数组arr中的非数值类型的元素值类型转换为整数或浮点数。
例如,程序array_sum.php如下。
<?php
$scores = array(70,80,90,60);
$grades = array('1A','2B','3C','4D');
$sumScores = array_sum($scores);
$sumGrades = array_sum($grades);
var_dump($sumScores); //输出:int(300)
echo "<br/>";
var_dump($sumGrades); //输出:int(10)
?>
5.array_product()函数
语法格式:number array_product ( array arr)
函数功能:统计并计算数组arr中所有元素值的乘积,该函数返回整数或浮点数。
说明:PHP会自动将数组arr中的非数值类型的数据类型转换为整数或浮点数。
例如,程序array_product.php如下。
<?php
$scores = array(70,80,90,60);
$grades = array('1A','2B','3C','4D');
$sumScores = array_product($scores);
$sumGrades = array_product($grades);
var_dump($sumScores); //输出:int(30240000)
echo "<br/>";
var_dump($sumGrades); //输出:int(24)
?>
6.array_count_values()函数
语法格式: array array_count_values ( array arr )
函数功能: 统计并计算数组arr中所有元素的值出现的次数。例如,程序array_count_values.php如下。
<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values ($array)); //输出:Array ( [1] => 2 [hello] => 2 [world] => 1 )
?>
实训1 数组的遍历
访问数组的所有元素的过程称为数组的遍历,使用数组统计count()函数和for循环语句可以遍历连续整数“键”的数组。例如,程序ergodic1.php如下,该程序的运行结果如图5-16所示。
<?php
$chars = range('a','d');
$counts = count($chars);
for($key=0;$key<$counts;$key++){
echo $chars[$key]."<br/>";
}
?>
5.4.3 数组指针函数
事实上,每一个PHP数组在创建之后都会自动建立一个“内部指针系统”:“内部指针系统”会为每一个新建的 PHP 数组自动建立一个“当前指针”(current)指向数组的第一个元素;每个元素有一个“内部指针”(next)指向下一个元素;每个元素有一个“内部指针”(previous)指向上一个元素。图5-17所示为程序createArray2.php产生的数组指针结构图。
图5-17中,$interests数组共有一个“当前指针”(current)、4个“内部指针”(next)和4个“内部指针”(previous)。“当前指针”(current)指向数组的第一个元素;每个元素中存在一个“内部指针”(next)且该“内部指针”指向下一个元素,由于最后一个元素后面没有元素,最后一个元素的“内部指针”(next)值为“空指针”,用“^”符号表示;“内部指针”(previous)以此类推。可以看出PHP数组是通过数组指针保证了数组的有序性。
PHP内置了管理数组“当前指针”(current)的函数,使用这些函数可以移动数组“当前指针”(current)并可以读取数组元素,继而实现数组的遍历。
数组指针函数中的数组类型参数为数组的引用&arr,因此经数组指针函数操作后的数组,其结构有可能发生变化(例如“当前指针”发生移动等)。
1.key()函数
语法格式:mixed key ( array &arr)
函数功能:返回数组arr中“当前指针”所指元素的“键”名。
说明:该函数并不移动“当前指针”,也不会修改数组arr的内部结构。
2.current()函数
语法格式:mixed current ( array &arr)
函数功能:返回数组arr中“当前指针”所指元素的“值”。
说明:current()函数的别名是pos。该函数并不移动“当前指针”,也不会修改数组arr的内部结构。
例如,程序keyAndValue.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
var_dump(key($interests)); //输出:int(2)
echo "<br/>";
var_dump(current($interests)); //输出:string(5) "music"
?>
3.next()函数
语法格式:mixed next ( array &arr )
函数功能:移动数组arr“当前指针”(current),使“当前指针”(current)指向数组arr的下一个元素,然后返回“当前指针”(current)所指的元素“值”。
说明:当“当前指针”(current)指向数组的最后一个元素时,使用 next()函数移动“当前指针”(current)后,“当前指针”(current)为“空”,并且“当前指针”(current)指向的元素“值”为FALSE。
例如,程序next.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
$second = next($interests);
$third = next($interests);
var_dump(key($interests)); //输出:int(1)
echo "<br/>";
var_dump(current($interests)); //输出:string(8) "computer"
echo "<br/>";
var_dump($second); //输出:string(5) "movie"
echo "<br/>";
var_dump($third); //输出:string(8) "computer"
?>
程序next.php执行到语句“$third = next($interests);”后,对应的数组指针结构图如图5-18所示。
4.end()函数
语法格式:mixed end ( array &arr )
函数功能:移动数组arr“当前指针”(current),使“当前指针”(current)指向数组arr最后一个元素,然后返回“当前指针”(current)所指的元素“值”。例如,程序end.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
$end = end($interests);
var_dump(key($interests)); //输出:int(6)
echo "<br/>";
var_dump(current($interests)); //输出:string(8) "software"
echo "<br/>";
var_dump($end); //输出:string(8) "software"
?>
5.prev()函数
语法格式:mixed prev ( array &arr )
函数功能:移动数组arr“当前指针”(current),使“当前指针”(current)指向数组arr上一个元素,然后返回“当前指针”(current)所指的元素“值”。
说明:当“当前指针”(current)为“空”时,使用prev()函数移动“当前指针”(current)后,“当前指针”(current)还为“空”,并且“当前指针”(current)指向的元素“值”为FALSE。
例如,程序prev.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
$end = end($interests);
$prev = prev($interests);
var_dump(key($interests)); //输出:int(1)
echo "<br/>";
var_dump(current($interests)); //输出:string(8) "computer"
echo "<br/>";
var_dump($end); //输出:string(8) "software"
echo "<br/>";
var_dump($prev); //输出:string(8) "computer"
?>
6.reset()函数
语法格式:mixed reset ( array &arr )
函数功能:移动数组arr“当前指针”(current),使“当前指针”(current)指向数组arr的第一个元素,然后返回“当前指针”(current)所指的元素“值”。例如,程序reset.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
$end = end($interests);
$first = reset($interests);
var_dump(key($interests)); //输出:int(2)
echo "<br/>";
var_dump(current($interests)); //输出:string(5) "music"
echo "<br/>";
var_dump($end); //输出:string(8) "software"
echo "<br/>";
var_dump($first); //输出:string(5) "music"
?>
7.each()函数
语法格式:array each ( array &arr)
函数功能:以数组形式返回“当前指针”(current)所指的元素(包括“键”和“值”),然后移动数组arr“当前指针”(current),使“当前指针”(current)指向数组arr下一个元素。
说明:该函数返回的数组中共有4个元素(“键值对”),4个元素的“键”名分别为:0、1、"key"和"value",“键”名为0和"key"的元素值为arr“当前指针”(current)所指的元素键名,“键”名为1和"value"的元素值为arr“当前指针”(current)所指的元素值(如表5-3所示)。
例如,程序each.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
$each = each($interests);/*以数组形式返回current指针所指的元素,然后将current指针指向下一个元素*/
print_r($each); //输出:Array ( [1] => music [value] => music [0] => 2 [key] => 2 )
echo "<br/>";
echo current($interests); //输出:movie。这是由于当前current指针指向第2个元素
?>
each()函数和next()函数的功能有些相似,但执行过程却大相径庭:each函数先以数组形式返回当前指针所指元素,然后向下移动当前指针;而next函数则是先移动当前指针,然后返回当前指针所指的元素值。
实训2 数组的遍历
使用next()函数和循环语句可以遍历非连续“键”的数组。例如,程序ergodic2.php如下,该程序的运行结果如图5-19所示。
<?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));
?>
由于使用next()函数返回数组下一个元素“值”,如果这个“值”为空,循环将不能继续执行下去,遍历有可能以失败告终。因此若数组中的某个元素“值”为“空”,不能使用next()函数遍历数组。例如,程序ergodicError.php如下,该程序的运行结果如图5-20所示。
<?php
$temp = range('a','d');
$temp[4] = 0;
print_r($temp);
echo "<br/>";
reset($temp);
do{
$key = key($temp);
$value = current($temp);
echo $key." ==> ".$value."<br/>";
}while(next($temp));
?>
5.4.4 数组和变量间的转换函数
PHP提供了数组和变量间的转换函数,方便数组元素和变量之间的相互转换。
1.list()语言结构
语法格式:void list ( mixed varname1[, mixed varname2[,mixed…]]) = array arr;
函数功能:用一步操作给一组变量进行赋值。list()语言结构中定义变量名varname1、varname2等,变量值在数组arr中。
说明:list()语言结构仅用于数字“键”的数组,并要求数字“键”从0 开始连续递增。
例如,程序list.php如下,该程序的运行结果如图5-21所示。
<?php
$info = array('coffee', 'brown', 'caffeine');
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.<br/>";
list($drink, , $power) = $info;
echo "$drink has $power.<br/>";
list( , , $power) = $info;
echo "I need $power!";
?>
2.extract()函数
语法格式:int extract ( array arr )
函数功能:extract()函数使用数组arr定义一组变量,其中变量名为数组arr元素的键名,变量值为数组arr元素“键”对应的值。例如,程序extract.php如下。
<?php
$info = array("studentNo"=>"20080101001","studentName"=>"张三","studentSex"=>"男");
extract($info);
echo $studentNo; //输出:20080101001
echo "<br/>";
echo $studentName; //输出:张三
echo "<br/>";
echo $studentSex; //输出:男
?>
3.compact()函数
语法格式:array compact ( mixed varname1[, mixed varname2[,mixed …]] )
函数功能:compact()函数返回一个数组,数组每个元素的“键”名为变量名 varname1 (varname2……),每个数组元素的“值”为变量 varname1(varname2……)的值。例如,程序compact.php如下。
<?php
$tel = "135****9114";
$email = "fallsoft@xxxy.com";
$postCode = "453000";
$result = compact("tel","email","postCode");
print_r($result); /*输出:Array ( [tel] => 135****9114 [email] => fallsoft@xxxy.com [postCode] => 453000 )*/
?>
实训3 数组的遍历
使用list()语言结构、each()函数和循环语句可以实现数组的遍历。例如,程序ergodic3.php如下,该程序的运行结果如图5-22所示。
<?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/>";
}
?>
在使用next()或each()函数遍历数组前,使用reset()函数将数组的“当前指针”复位是一个好习惯。
5.4.5 数组遍历语言结构
使用前面的方法固然可以实现数组的遍历,但这些方法却不是遍历数组的最好选择,因为PHP引入了遍历数组更为简便快捷的方法:foreach语言结构。
foreach语言结构有以下两种用法。
1.foreach(array as $value)
使用该方法循环遍历给定的数组 array,每次循环中,“当前指针”所指元素的“值”赋给变量$value ,然后移动数组 array“当前指针”,使“当前指针”指向下一个元素,周而复始,直至数组array最后一个元素,此时“当前指针”为空。
2.foreach(array as $key=>$value)
使用该方法循环遍历给定的数组 array,每次循环中,“当前指针”所指元素的“键”名赋给变量$key,“当前指针”所指元素的值赋给变量$value,然后移动数组array“当前指针”,使“当前指针”指向下一个元素,周而复始,直至数组array最后一个元素,此时“当前指针”为空。
例如,程序foreach.php如下,该程序的运行结果如图5-23所示。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
foreach($interests as $value){
echo $value."<br/>";
}
foreach($interests as $key=>$value){
echo $key."=>".$value."<br/>";
}
?>
使用foreach语言结构除了可以实现对数组的遍历,还可以实现数组元素的键或值的修改。比较下面3个程序foreach1.php、foreach2.php和foreach3.php。注意:这3个程序中只有foreach1.php和foreach2.php实现了数组元素值的修改。
程序foreach1.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
foreach($interests as $key=>&$value){
$value = "I like ".$value;
}
print_r($interests);/* 输出:Array ( [2] => I like music [5] => I like movie [1] => I like computer [6] => I like software ) */
?>
图5-24所示为foreach第一遍遍历后的内存分配图,可以看出此时数组的第一个元素值已经变为了" I like music"。
程序foreach2.php
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
foreach($interests as $key=>$value){
$interests[$key] = "I like ".$value;
}
print_r($interests);/* 输出:Array ( [2] => I like music [5] => I like movie [1] => I like computer [6] => I like software ) */
?>
程序 foreach2.php 的运行结果和程序 foreach1.php 的运行结果相同。图 5-25 所示为程序foreach2.php使用foreach语言结构第一遍遍历后的内存分配图,可以看出此时数组的第一个元素值已经变为了" I like music",只不过$value的值还是"music"。
程序foreach3.php
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
foreach($interests as $key=>$value){
$value = "I like ".$value;
}
print_r($interests); // 输出:Array ( [2] => music [5] => movie [1] => computer [6] => software )
?>
图5-26所示为程序foreach3.php使用foreach语言结构第一遍遍历后的内存分配图,可以看出此时数组中第一个元素值并未发生变化,只有$value的值变为了"I like music"。
上面的3个程序中,只有程序foreach1.php和程序foreach2.php实现了对数组元素值的修改,程序foreach3.php“貌似”实现了对数组元素值的修改,分析3个程序运行过程中的内存分配图可以轻松地找出其中的原因。
每次执行foreach语言结构时,数组array“当前指针”(current)会自动指向第一个元素,即在使用foreach遍历数组时,不需要调用reset()函数。
foreach 语言结构操作的是数组的一个拷贝,而不是该数组本身。在 foreach 遍历数组的过程中,尽量不要使用数组指针函数操作“当前指针”(current),否则会事与愿违。
例如,程序foreachError.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
foreach($interests as $key=>$value){
echo "I like ".current($interests)." !<br/>";
echo $value."<br/>";
}
?>
程序foreachError.php的运行结果如图5-27所示。
5.4.6 数组检索函数
数组的检索主要指对数组元素的“键”或者“值”进行查询,PHP提供了数组检索函数实现对数组元素的查询。对数组元素查询时,按照是否存在查询条件,将数组的检索函数分为两类:不带条件的数组检索函数和带条件的数组检索函数。不带条件的数组检索函数包括array_values()函数;带条件的数组检索函数包括 in_array()函数、array_key_exists()函数和 array_search()函数;array_keys()函数既可带条件,也可不带条件。
1.array_keys()函数
语法格式:array array_keys ( array arr [, mixed searchValue ] )
函数功能:array_keys() 函数以数组的形式返回arr数组中的“键名”。 如果指定了可选参数searchValue,则只返回searchValue值的键名;否则arr数组中的所有键名都会被返回。
说明:如果searchValue是字符串,比较时区分大小写。
例如,程序array_keys.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
$interests[] = "computer";
$keys = array_keys($interests);
print_r($keys); //输出:Array ( [0] => 2 [1] => 5 [2] => 1 [3] => 6 [4] => 7 )
echo "<br/>";
$searchKeys1 = array_keys($interests,"computer");
print_r($searchKeys1); //输出:Array ( [0] => 1 [1] => 7 )
echo "<br/>";
$searchKeys2 = array_keys($interests,"Computer");
print_r($searchKeys2); //输出:Array ( )
?>
2.array_values()函数
语法格式:array array_values ( array arr )
函数功能:array_values() 函数以数组的形式返回 arr 数组中所有的元素值(过滤掉重复的元素值),并为该数组建立连续的整数“键”。例如,程序array_values.php如下。
<?php
$interests[2] = "music";
$interests[5] = "movie";
$interests[1] = "computer";
$interests[] = "software";
$interests[] = "computer";
$values = array_values($interests);
print_r($values);/*输出:Array ( [0] => music [1] => movie [2] => computer [3] => software [4] => computer ) */
?>
3.in_array()函数
语法格式:bool in_array ( mixed searchValue, array arr [, bool strict] )
函数功能:检查数组arr中是否存在值searchValue,如果存在则返回TRUE,否则返回FALSE。如果第3个参数strict的值为TRUE,则in_array() 函数还会检查数据类型是否相同。strict的默认值为FALSE。
说明:如果searchValue是字符串,比较时区分大小写。
例如,程序in_array.php如下。
<?php
$words = array("JAVA","PHP",".NET");
$javaExisted = in_array("java",$words);
$phpExisted = in_array("PHP",$words);
var_dump($javaExisted); //输出:bool(false)
echo "<br/>";
var_dump($phpExisted); //输出:bool(true)
echo "<br/>";
$numbers = array("1.10", 12.4, 1.13);
$numExisted1 = in_array(1.10,$numbers);
$numExisted2 = in_array(1.10,$numbers,TRUE);
var_dump($numExisted1); //输出:bool(true)
echo "<br/>";
var_dump($numExisted2); //输出:bool(false)
?>
4.array_key_exists()函数
语法格式:bool array_key_exists ( mixed keyName, array arr )
函数功能:检查数组arr中是否存在键名keyName,如果存在则返回TRUE,否则返回FALSE。例如,程序array_key_exists.php如下。
<?php
$words = array("SUN"=>"JAVA","Microsoft"=>".NET");
$keyExisted1 = array_key_exists("SUN",$words);
$keyExisted2 = array_key_exists("sun",$words);
var_dump($keyExisted1); //输出:bool(true)
echo "<br/>";
var_dump($keyExisted2); //输出:bool(false)
?>
5.array_search()函数
语法格式:mixed array_search ( mixed searchValue, array arr [, bool strict] )
函数功能:在数组 arr中搜索给定的值 searchValue,如果找到则返回对应的键名,否则返回FALSE。如果第3个参数strict的值为TRUE,则array_search ()函数还会检查数据类型是否相同。strict的默认值为FALSE。
说明:如果searchValue是字符串,则比较时区分大小写;如果searchValue在arr中出现不止一次,则返回第一个匹配的键;要返回所有匹配值的键,应该用array_keys()函数。
例如,程序array_search.php如下。
<?php
$words = array(".NET"=>"Microsoft","JAVA"=>"SUN","JSP"=>"SUN");
$searchKey1 = array_search("SUN",$words);
var_dump($searchKey1); //输出:string(4) "JAVA"
echo "<br/>";
$searchKey2 = array_search("microsoft",$words);
var_dump($searchKey2); //输出:bool(false)
echo "<br/>";
$numbers = array("PI"=>"3.14","直角"=>"90");
$searchKey3 = array_search(90,$numbers);
$searchKey4 = array_search(90,$numbers,TRUE);
var_dump($searchKey3); //输出:string(4) "直角"
echo "<br/>";
var_dump($searchKey4); //输出:bool(false)
?>
6.array_unique()函数
语法格式:array array_unique ( array arr )
函数功能:array_unique()函数返回一个移除数组arr中重复的元素“值”的新数组。
说明:array_unique()函数保持了原有的“键值对”对应关系,对每个值只保留第一个遇到的键名。
例如,程序array_unique.php如下。
<?php
$colors = array("a" => "green", "red", "b" => "green", "blue", "red");
$colorUnique = array_unique($colors);
print_r($colorUnique); //输出:Array ( [a] => green [0] => red [1] => blue )
echo "<br/>";
$input = array(4, "4", "3", 4, 3, "3");
$inputUnique = array_unique($input);
print_r($inputUnique); //输出:Array ( [0] => 4 [2] => 3 )
?>
5.4.7 数组排序函数
PHP提供了多种数组排序函数,包括sort()、asort()、rsort()、arsort()、ksort()、krsort()、natsort()、natcasesort()、natsort()、shuffle()和array_reverse()函数,其中最简单的排序函数是sort()函数。
1.sort()函数
语法格式:bool sort ( array &arr )
函数功能:sort()函数按元素“值”的升序对数组arr进行排序。如果排序成功则返回TRUE,否则返回FALSE。
说明:sort()函数为排序后的数组arr赋予新的“整数”键名。
例如,程序sort.php如下。
<?php
$array = array("img12.gif","img10.gif","img2.gif","img1.gif");
sort($array);
print_r($array);/*输出:Array([0] => img1.gif [1] => img10.gif [2] => img12.gif [3] =>img2.gif )*/
?>
2.asort()函数
语法格式:bool asort ( array &arr )
函数功能:asort()函数按元素“值”的升序对数组arr进行排序。如果排序成功则返回TRUE,否则返回FALSE。
说明:数组arr经asort()函数排序后,保持数组元素原有的“键值对”对应关系。
例如,程序asort.php如下。
<?php
$array = array("img12.gif", "img10.gif", "img2.gif", "img1.gif");
asort($array);
print_r($array);/*输出:Array ( [3] => img1.gif [1] => img10.gif [0] => img12.gif [2] => img2.gif )*/
?>
3.rsort()函数和arsort()函数
rsort()函数和与 sort()函数语法格式相同,arsort()函数与 asort()函数语法格式相同,不同的是rsort()函数和arsort()函数是按降序对数组进行排序。例如,程序rsort.php如下。
<?php
$array1 = $array2 = array("img12.gif","img10.gif","img2.gif","img1.gif");
rsort($array1);
print_r($array1);/*输出:Array ( [0] => img2.gif [1] => img12.gif [2] => img10.gif [3] => img1.gif ) */
echo "<br/>";
arsort($array2);
print_r($array2); /*输出:Array ( [2] => img2.gif [0] => img12.gif [1] => img10.gif [3] => img1.gif ) */
?>
4.ksort()函数
语法格式:bool ksort ( array & arr )
函数功能:ksort()函数对数组arr按照键名升序排序,并保持数组元素原有的“键值对”对应关系。如果成功则返回TRUE,否则返回FALSE。
5.krsort()函数
语法格式:bool krsort ( array & arr )
函数功能:krsort()函数对数组 arr 按照键名降序排序,并保持数组元素原有的“键值对”对应关系。如果成功则返回TRUE,否则返回FALSE。
例如,程序ksort.php如下。
<?php
$array1 = $array2 = array("c"=>"China","f"=>"French","e"=>"English");
ksort($array1);
print_r($array1); //输出:Array ( [c] => China [e] => English [f] => French )
echo "<br/>";
krsort($array2);
print_r($array2); //输出:Array ([f] => French [e] => English [c] => China )
?>
6.natsort()函数
语法格式:bool natsort ( array &arr )
函数功能:用“自然排序”算法对数组 arr 元素“值”进行升序排序,并保持数组元素原有的“键值对”对应关系不变。例如,程序natsort.php如下。
<?php
$array = array("Img12.gif","img10.gif","img2.gif","Img1.gif");
natsort($array);
print_r($array);/*输出:Array ( [3] => Img1.gif [0] => Img12.gif [2] => img2.gif [1] => img10.gif ) */
?>
7.natcasesort()函数
语法格式:bool natcasesort ( array &arr )
函数功能:用“自然排序”算法对数组 arr 元素“值”进行不区分大小写字母的升序排序,并保持数组元素原有的“键值对”对应关系不变。例如,程序natcasesort.php如下。
<?php
$array = array("Img12.gif","img10.gif","img2.gif","Img1.gif");
natcasesort($array);
print_r($array);/*输出:Array ( [3] => Img1.gif [2] => img2.gif [1] => img10.gif [0] => Img12.gif ) */
?>
8.shuffle()函数
语法格式:bool shuffle ( array &arr )
函数功能:shuffle()函数为数组arr随机排序。
说明:shuffle ()函数将为随机排序后的数组arr赋予新的键名。
例如,程序shuffle.php如下。
<?php
$array = array("img12.gif","img10.gif","img2.gif","img1.gif");
shuffle($array);
print_r($array);/*可能输出:Array ( [0] => img12.gif [1] => img10.gif [2] => img1.gif [3] => img2.gif ) */
echo "<br/>";
shuffle($array);
print_r($array); /*可能输出:Array ( [0] => img12.gif [1] => img2.gif [2] => img10.gif [3] => img1.gif ) */
?>
程序shuffle.php的运行结果说明,经shuffle()函数随机排序的数组每次产生的结果可能不一样。
9.array_reverse()函数
语法格式:array array_reverse ( array arr [, bool preserve_keys] )
函数功能:array_reverse()函数返回一个和数组arr元素顺序相反的新数组,如果preserve_keys为TRUE 则保持数组元素原有的“键值对”对应关系不变。例如,程序array_reverse.php如下。
<?php
$array = array("img12.gif","img10.gif","img2.gif","img1.gif");
$newArray1 = array_reverse($array);
print_r($newArray1);/*输出:Array ( [0] => img1.gif [1] => img2.gif [2] => img10.gif [3] => img12.gif ) */
echo "<br/>";
$newArray2 = array_reverse($array,TRUE);
print_r($newArray2); /*输出:Array ( [3] => img1.gif [2] => img2.gif [1] => img10.gif [0] => img12.gif ) */
?>
当数组排序函数中的数组参数为数组的引用&arr时(array_reverse()函数除外),经数组排序函数操作后的数组,其结构有可能发生变化(例如数组元素的顺序、键值对对应关系等可能发生变化)。
排序函数记忆技巧如下。
(1)排序函数中“a”表示association,含义是排序的过程中保持“键值对”的对应关系不变。
(2)排序函数中“k”表示key,含义是按照数组元素“键”而不是数组元素“值”排序。
(3)排序函数中“r”表示reverse,含义是按数组元素“值”的降序(descend)进行排序。
(4)排序函数中“nat”的表示natural,含义是用“自然排序”算法对数组元素“值”进行排序。
5.4.8 数组与数据结构
PHP提供了模拟栈等数据结构操作的函数,包括array_push()、array_pop()、array_unshift()和array_shift()函数等。
1.array_push()函数
语法格式:int array_push ( array &arr, mixed var1 [, mixed var2 [, mixed …]] )
函数功能:array_push()函数将arr当成一个栈,并将参数var1、var2…依次压入arr的末尾,该函数返回新数组元素的个数。例如,程序array_push.php如下。
<?php
$stack = array("orange", "banana");
$counts = array_push($stack, "apple", "pear");
print_r($stack); //输出:Array ( [0] => orange [1] => banana [2] => apple [3] => pear )
echo "<br/>";
echo $counts; //输出:4
?>
2.array_pop()函数
语法格式:mixed array_pop ( array &arr )
函数功能:array_pop()函数弹出数组arr最后一个元素,并返回该元素值。如果array为空(或者不是数组),将返回NULL。
说明:使用array_pop()函数后会把数组arr的“当前指针”复位(自动调用reset()函数)。
例如,程序array_pop.php如下。
<?php
$stack = array("orange", "banana", "apple", "pear");
$fruit = array_pop($stack);
print_r($stack); //输出:Array ( [0] => orange [1] => banana [2] => apple )
echo "<br/>";
echo $fruit; //输出:pear
?>
3.array_unshift()函数
语法格式:int array_unshift ( array &arr, mixed var1 [, mixed var2 [, mixed…]] )
函数功能:array_unshift()函数将arr当成一个特殊的队列(如图5-28所示),并将参数var2、var1……依次插入arr的队首。该函数返回入队元素的个数。
说明:这个特殊的队列限定在队首插入元素,在队首删除元素。使用array_unshift()函数后会把数组arr的“当前指针”复位(自动调用reset()函数)。
例如,程序array_unshift.php如下。
<?php
$queue = array("orange", "banana");
$counts = array_unshift($queue,"pear");
$counts = array_unshift($queue, "apple");
print_r($queue); //输出:Array ( [0] => apple [1] => pear [2] => orange [3] => banana )
echo "<br/>";
echo $counts; //输出:4
?>
4.array_shift()函数
语法格式:mixed array_shift ( array &arr )
函数功能:array_shift()函数删除数组arr第一个元素,并返回该元素值。如果array为空(或者不是数组),将返回NULL。
说明:使用array_shift()函数后会把数组arr的“当前指针”复位(自动调用reset()函数)。
例如,程序array_shift.php如下。
<?php
$queue = array("orange", "banana", "apple", "pear");
$fruit = array_shift($queue);
print_r($queue); //输出:Array ( [0] => banana [1] => apple [2] => pear )
echo "<br/>";
echo $fruit; //输出:orange
?>
5.4.9 数组集合运算函数
可以将数组作为数学中“集合”的概念进行处理,利用PHP提供的数组集合运算函数进行数组间的并集、差集或交集运算等。
1.array_merge()函数
语法格式:array array_merge ( array arr1 [, array arr2 [, array…]] )
函数功能:将数组arr1、arr2等合并为一个新数组,该函数返回该新数组(集合的并集运算)。多个数组中,如果元素的键名相同,则后面的数组的元素“值”覆盖前面数组的元素“值”。如果数组元素的键名是数字,后面的值将不会覆盖原来的值,而是附加到后面。例如,程序array_merge.php如下。
<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);/*输出:Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => trapezoid [4] => 4 ) */
?>
2.array_diff()函数
语法格式:array array_diff ( array arr1 [, array arr2 [, array…]] )
函数功能:array_diff() 函数返回一个新数组,新数组中的元素“值”是所有在 arr1 中,但不在任何其他参数数组中的元素“值”(集合的差集运算)。例如,程序array_diff.php如下。
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "red", "yellow");
$result = array_diff($array1, $array2);
print_r($result); //输出:Array ( [1] => blue )
?>
3.array_intersect()函数
语法格式:array array_intersect ( array arr1 [, array arr2 [, array…]] )
函数功能:array_intersect()函数返回一个新数组,新数组中的元素“值”是既在arr1数组中,又在arr2等数组中出现的元素“值”(集合的交集运算)。例如,程序array_intersect.php如下。
<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "red", "yellow");
$result = array_intersect ($array1, $array2);
print_r($result); //输出:Array ( [a] => green [0] => red )
?>
4.array_diff_assoc ()函数
语法格式:array array_diff_assoc ( array arr1 [, array arr2 [, array…]] )
函数功能:array_diff_assoc () 函数返回一个新数组,新数组中的元素是所有在 arr1 中,但不在任何其他参数数组中的元素(集合的差集运算)。
说明:注意数组元素的键名也用于比较。
例如,程序array_diff_assoc.php如下。
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "red", "yellow");
$result = array_diff_assoc($array1, $array2);
print_r($result); //输出:Array ( [a] => green [1] => blue [2] => red )
?>
5.array_intersect_assoc()函数
语法格式:array array_intersect_assoc ( array arr1 [, array arr2 [, array…]] )
函数功能:array_intersect_assoc ()函数返回一个新数组,新数组中的元素是既在 arr1数组中,又在arr2等数组中出现的元素(集合的交集运算)。
说明:注意数组元素的键名也用于比较。
例如,程序array_intersect_assoc.php如下。
<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "red", "yellow");
$result = array_intersect_assoc ($array1, $array2);
print_r($result); //输出:Array ( [0] => red )
?>
6.array_diff_key()函数
语法格式:array array_diff_key ( array arr1 [, array arr2 [, array…]] )
函数功能:array_diff_key () 函数返回一个新数组,新数组中的元素“键”是所有在 arr1 中,但不在任何其他参数数组中的元素“键”(集合的差集运算)。例如,程序array_diff_key.php如下。
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'white' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'black' => 8);
$result = array_diff_key($array1, $array2);
print_r($result); //输出:Array ( [red] => 2 [white] => 4 )
?>
7.array_intersect_key()函数
语法格式:array array_intersect_key ( array arr1 [, array arr2 [, array…]] )
函数功能:array_intersect_key () 函数返回一个新数组,新数组中的元素“键”是既在 arr1 数组中,又在arr2等数组中出现的元素“键”(集合的交集运算)。例如,程序array_intersect_key.php如下。
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'white' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'black' => 8);
$result = array_intersect_key($array1, $array2);
print_r($result); //输出:Array ( [blue] => 1 [green] => 3 )
?>