接下来我们继续学习零起点php入门第16课,这节课陌小雨和大家一起来学习关联数组。
我们知道PHP的数组索引也是可以自定义的,它允许的类型为整型和字符串形,这种使用自定义键名的数组就称为关联数组。关联数组的极大多数使用方法同索引数组是相同的,因此本节课主要学习定义关联数组、数组的比较运算符和遍历数组的其他一些方式。
定义关联数组即为数组显式地指定索引名,指定的方式非常简单,通常的形式如下:
array(索引=>值…)
关联数组中同样可以有不显式指定索引的元素,被省略的索引按照索引数组的指定规则进行指定,我们可以通过一个示例来演示。
<?php $arr=array('name'=>'PHP','age'=>22,7=>25,33,21=>35,56); //定义一个关联数组 echo '数组$arr的元素个数为:'.count($arr); //输出关联数组的元素个数 echo '<br />该数组的详细信息为:<br />'; print_r($arr); //输出数组的详细信息 ?>
上述代码运行结果为:
数组$arr的元素个数为:6
该数组的详细信息为:
Array ( [name] => PHP [age] => 22 [7] => 25 [8] => 33 [21] => 35 [22] => 56 )
在上述例子中,需要小伙伴们注意的就是数组的索引值的变化规律,还有就是数组元素的个数并不会因为数组指定了21作为索引而使得数组的长度变为21。
1、数组比较运算符
PHP中提供了专门用于对数组进行比较的运算符,如下图所示。
上图中的相等(==)和全等(===)运算符,这两个运算符的区别就在于元素的顺序以及元素的类型。如下所示的两个数组:
$arra=array('hello','hi')
$arrb=array(1=>'hi',0=>'hello')
数组$arra与数组$arrb相等但不全等,不全等是因为他们的索引/值顺序不同。再来看两个数组:
$arrc=array(1,2)
$arrd=array('1',2);
数组$arrc与数组$arrd同样相等但不全等,不全等是因为元素的类型不同。不等和不全等运算符的使用方法正好和他们相反,这里就不再赘述。
<?php $arra=array('hello','hi'); //定义多个数组 $arrb=array(1=>'hi',0=>'hello'); $arrc=array(1,2); $arrd=array('1',2); echo '$arra:'; print_r($arra); //输出各个数组的信息以便读者对照 echo '<br />$arrb:'; print_r($arrb); echo '<br />$arrc:'; print_r($arrc); echo '<br />$arrd:'; print_r($arrd); echo '<br />$arra==$arrb:'.($arra==$arrb); //对数组进行比较运算并输出计算结果 echo '<br />$arra===$arrb:'.($arra===$arrb); echo '<br />$arrc==$arrd:'.($arrc==$arrd); echo '<br />$arrc===$arrd:'.($arrc===$arrd); echo '<br />$arra!=$arrc:'.($arra!=$arrc); echo '<br />$arrb<>$arrd:'.($arrb<>$arrd); ?>
上述代码运行结果为:
$arra:Array ( [0] => hello [1] => hi )
$arrb:Array ( [1] => hi [0] => hello )
$arrc:Array ( [0] => 1 [1] => 2 )
$arrd:Array ( [0] => 1 [1] => 2 )
$arra==$arrb:1
$arra===$arrb:
$arrc==$arrd:1
$arrc===$arrd:
$arra!=$arrc:1
$arrb<>$arrd:1
2、使用foreach结构遍历数组
前面的课程我们已经使用过for循环来遍历索引数组。然而关联数组的索引值通常是自定义的,因此通常不能通过for循环来遍历。foreach是PHP中专门用来遍历数组的结构,它有两种使用形式,如下所示:
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
第一种形式中的参数array_expression表示要进行遍历的数组;参数$value用来接收当前元素的值。
第二种形式是第一种形式的补充,除了使用参数$value来接收当前元素的值外,还使用参数$key来接收当前元素的键值。foreach结构的工作原理是每次循环都会访问下一个数组元素。
数组指针是数组内部特有的指针,它初始会指向数组的第一个元素,可以通过数组指针操作函数来对指针进行操作。由于foreach控制的是数组的指针,因此可以遍历任意数组。
<?php $arr=array(63,'abc',45,'hello',3,7,9,'DEF'); //定义一个索引数组 echo '遍历一个索引数组:<br />'; foreach($arr as $v) //使用foreach遍历数组 echo "{$v} "; $arra=array('a'=>17,'B'=>'hello',123,'def','III'=>3); //定义一个关联数组 echo '<br />遍历一个关联数组:<br />'; foreach($arra as $k=>$v) //使用foreach遍历数组 echo "{$k}=>{$v}<br />"; ?>
上述代码运行结果为:
遍历一个索引数组:
63 abc 45 hello 3 7 9 DEF
遍历一个关联数组:
a=>17
B=>hello
0=>123
1=>def
III=>3
从运行结果我们可以看到,使用foreach可以轻松完成遍历一个索引数组。当然foreach不止可以用来输出数组元素,下面我们就来演示使用foreach修改数组中元素的值。由于foreach默认是使用传值赋值,因此我们可以以引用的形式来访问元素并修改其值。
<?php $arr=array('I'=>1,'II'=>2,'III'=>3,'IV'=>4,'V'=>5); //定义一个数组 echo '修改之前数组信息:<br />'; print_r($arr); //输出修改之前数组信息 foreach($arr as &$v) $v=$v*2+1; //使用遍历修改数组的值 echo '<br />修改之后数组信息:<br />'; print_r($arr); //输出修改之后数组信息 ?>
上述代码运行结果为:
修改之前数组信息:
Array ( [I] => 1 [II] => 2 [III] => 3 [IV] => 4 [V] => 5 )
修改之后数组信息:
Array ( [I] => 3 [II] => 5 [III] => 7 [IV] => 9 [V] => 11 )
从运行结果我们可以看到,使用foreach成功修改了原数组的元素值。
foreach结构就是通过控制数组指针来遍历一个数组的。除此之外,PHP中专门提供了多个指针控制函数,使用指针控制函数可以更加灵活地对数组进行操作。我们首先来介绍这些控制函数,然后再使用这些函数进行遍历数组以及进行其他的操作。
3、each()和list()
each函数返回数组中当前的索引/值对并将数组指针向前移动一步,该函数的形式如下:
array each ( array &$array )
该函数会返回一个含有四个元素的数组,形式如下所示:
Array ( [1] =>值 [value] =>值 [0] => 索引 [key] => 索引)
该函数当数组指针移出数组时会返回FALSE。
<?php $arr=array(1,2,'III'=>3,'IV'=>4); //定义一个数组 for($i=0;$i<count($arr);$i++){ print_r(each($arr)); //循环输出数组的索引/值对 echo '<br />'; } ?>
上述代码运行结果为:
Array ( [1] => 1 [value] => 1 [0] => 0 [key] => 0 )
Array ( [1] => 2 [value] => 2 [0] => 1 [key] => 1 )
Array ( [1] => 3 [value] => 3 [0] => III [key] => III )
Array ( [1] => 4 [value] => 4 [0] => IV [key] => IV )
以上代码之所以可以通过一个简单的循环来输出对应元素的索引/值对,是由于每次调用each函数均会向前移动指针。
list函数用来把数组中的值赋给一些变量
array list ( mixed $varname [, mixed $... ] )
函数中的参数varname用来接收数组对应的元素而且只能接收键为数字的元素即list的第一个参数会接收数组中最小键值对应的值。
<?php $arr=array(1,2,'III'=>3,'IV'=>4); //定义一个数组 list($k,$v)=each($arr); //使用list函数接受each函数返回的值 echo "{$k}=>{$v}"; //输出变量k和v的值 ?>
上述代码运行结果为:
0=>1
运行结果中输出的是数组$arr的第一个元素的索引/值对。因此我们就可以通过循环来依次输出数组的键值对。接下来我们试试用while循环联合list和each函数遍历数组。
<?php $arr=array(1,2,'III'=>3,'IV'=>4); //定义一个数组 while(list($k,$v)=each($arr)){ //使用each函数返回FALSE的特性作为判断条件 echo "{$k}=>{$v}<br />"; //输出数组的索引/值对 } ?>
上述代码运行结果为:
0=>1
1=>2
III=>3
IV=>4
从运行结果我们可以看到成功遍历输出了数组的索引/值对,当然也可以使用for循环来遍历,这里就不再详细讲解,小伙伴们可以自己尝试写在评论下方哈(用pre标签包裹代码)。
4、数组指针控制函数
PHP中提供了多个指针控制函数,下面就分别介绍这些函数:
current():返回当前数组指针指向的元素,如果数组指针指向超出了单元列表的末端则返回FALSE,它的原型如下:
mixed current ( array &$array )
end():将数组的内部指针指向最后一个元素并返回其值,它的原型如下:
mixed end ( array &$array )
next():将数组中的内部指针向前移动一位并返回其值,当没有更多单元时返回FALSE,它的原型如下:
mixed next ( array &$array )
prev():将数组的内部指针倒回一位并返回其值,当没有更多单元时返回FALSE,它的原型如下:
mixed prev ( array &$array )
reset():将数组的内部指针指向第一个元素并返回其值,如果数组为空则返回FALSE,它的原型如下:
mixed reset ( array &$array )
这些数组指针控制函数的加入,使得PHP的数组使用可以极为灵活。我们可以通过使用指针控制函数很方便地访问任何数字的任何元素。
<?php function return_item($arr,$num=0){ //定义函数 for($i=0;$i<$num;$i++){ //循环向前移动数组指针 next($arr); } echo "<br />第{$num}个元素为:".current($arr); //输出当前数组指针指向的元素 } $arr=array('I'=>'hello','II'=>2,'III'=>'D','IV'=>376,358); //定义一个数组 echo '输出数组的详细信息:'; return_item($arr); //调用函数并传入参数输出对应的数组元素 return_item($arr,1); return_item($arr,2); return_item($arr,3); return_item($arr,5); //由于数组元素只有5个,因此输出第6个元素为空 ?>
上述代码运行结果为:
输出数组的详细信息:
第0个元素为:hello
第1个元素为:2
第2个元素为:D
第3个元素为:376
第5个元素为:
上面的代码演示了使用next函数向前移动数组指针来输出数组元素的值,我们还可以通过扩展自定义函数来使用prev函数向后移动指针来返回数组元素的值。
<?php function return_item($arr,$num=0){ //定义函数 if($num<0){ end($arr); //将数组指针指向最后一个元素 for($i=0;$i<abs($num)-1;$i++){ //abs函数用于取得变量的绝对值 prev($arr); } echo "<br />第{$num}个元素为:".current($arr); //输出当前数组指针指向的元素 }else{ for($i=0;$i<$num;$i++){ //循环向前移动数组指针 next($arr); } echo "<br />第{$num}个元素为:".current($arr); //输出当前数组指针指向的元素 } } $arr=array('I'=>'hello','II'=>2,'III'=>'D','IV'=>376,358); //定义一个数组 echo '输出数组的详细信息:'; return_item($arr); //调用函数并传入参数输出对应的数组元素 return_item($arr,-1); return_item($arr,2); return_item($arr,1); return_item($arr,-2); ?>
上述代码运行结果为:
输出数组的详细信息:
第0个元素为:hello
第-1个元素为:358
第2个元素为:D
第1个元素为:2
第-2个元素为:376
以上的代码中的自定义函数通过接受整数和负数参数实现了从数组的正向和反向来输出数组元素。这里只简单展现了数组控制指针的灵活之处,小伙伴可以通过自己扩展函数来获得更加灵活的功能。