前面几节课我们基本上对数组有了一个比较清晰的认识,这节课陌小雨带大家学习下php多维数组和系统预定义数组。
我们知道PHP中的数组可以存储多种类型的数据,其中就包括数组。本节我们将要讲解的是数组作为数组元素的形式,这种形式的数组被称为多维数组。常用的多维数组是二维数组和三维数组,陌小雨博客将主要介绍二维数组。
我们知道一个学生有多个科目的成绩,那么我们就可以用如下的形式来保存一个班里多个学生的成绩:
$stu01=array(76,87,68,…,98);
$stu02=array(65,89,95,…,76);
$stu03=array(90,80,66,…,60);
…
$stun=array(90,95,65,…,100);
我们可以想到如果一个班级有50个学生的话,我们就需要声明50个变量来存储他们的成绩,这就类似于本章开头的例子。那么自然就可以想到我们同样可以使用数组来保存这些数据,只不过这个数组的元素也是一些数组而已,我们可以改写为如下的形式:
$stu=array(array(76,87,68,…,98),
array(65,89,95,…,76),
array(90,80,66,…,60),
…
array(90,95,65,…,100));
从上面的形式我们可以看到,省去了多个变量的声明,而且访问其中的成绩也与一维数组无异。
1、访问二维数组的元素
访问二维数组的元素同样使用如下的形式:
数组名[索引]
使用上面的形式访问到的通常会是一个数组。
<?php $stu=array(array(76,87,68), array(65,89,95), array(90,80,66), array(90,95,65)); //定义一个二维数组 echo '输出$stu数组的第一个元素:<br />'; print_r($stu[0]); //由于访问到的将会是一个数组,因此使用print_r来输出 echo '<br />输出$stu数组的第二个元素:<br />'; print_r($stu[1]); echo '<br />输出$stu数组的第三个元素:<br />'; print_r($stu[2]); echo '<br />输出$stu数组的第四个元素:<br />'; print_r($stu[3]); ?>
上述代码运行结果为:
输出$stu数组的第一个元素:
Array ( [0] => 76 [1] => 87 [2] => 68 )
输出$stu数组的第二个元素:
Array ( [0] => 65 [1] => 89 [2] => 95 )
输出$stu数组的第三个元素:
Array ( [0] => 90 [1] => 80 [2] => 66 )
输出$stu数组的第四个元素:
Array ( [0] => 90 [1] => 95 [2] => 65 )
从运行结果我们可以看到,代码成功访问到了数组中的元素,并输出其信息。
由于使用“数组名[索引]”形式访问到的是一个数组,因此我们可以将其作为数组名来访问其中的元素,形式如下:
数组名[索引][索引]
<?php $stu=array(array(76,87,68), array(65,89,95), array(90,80,66), array(90,95,65)); //定义一个二维数组 echo '$stu数组的第1个数组元素的第一个元素为:'.$stu[0][0]; //访问数组中的指定元素 echo '<br />$stu数组的第2个数组元素的第二个元素为:'.$stu[1][1]; echo '<br />$stu数组的第3个数组元素的第三个元素为:'.$stu[2][2]; ?>
上述代码运行结果为:
$stu数组的第1个数组元素的第一个元素为:76
$stu数组的第2个数组元素的第二个元素为:89
$stu数组的第3个数组元素的第三个元素为:66
从运行结果中我们可以看到,使用“数组名[索引][索引]”的形式正确访问到了指定的数组元素,这也是二维数组的重点知识。二维数组同样可以为关联数组即可以自定义索引名,这里陌小雨就不展开了。
2、遍历二维数组
二维数组通常使用foreach来遍历,对于规则的二维数组,也就是说数组的元素均为数组的二维数组,通常的形式如下:
array(array(…),array(…),array(…),array…)
这种形式的二维数组我们可以通过使用foreach嵌套来实现遍历数组元素。
<?php $stu=array(array(76,87,68), array(65,89,95), array(90,80,66), array(90,95,65)); //定义一个二维数组 foreach($stu as $k=>$v){ //遍历数组 echo "元素{$k}中的元素:<br />"; foreach($v as $k=>$v){ echo " {$k}=>{$v}"; //输出数组的索引/值对 } echo '<br />'; } ?>
上述代码运行结果为:
元素0中的元素:
0=>76 1=>87 2=>68
元素1中的元素:
0=>65 1=>89 2=>95
元素2中的元素:
0=>90 1=>80 2=>66
元素3中的元素:
0=>90 1=>95 2=>65
从运行结果我们可以看出,我们遍历输出了数组的所有元素。但是这段代码不能用来遍历一个不规则的二维数组即数组中有的元素不为数组的二维数组,通常的形式如下:
array(array(…),$value…,array(…)…)
如果要遍历这种二维数组可以在foreach中添加判断来遍历,也可以通过递归来遍历,这里我们只介绍使用递归的方式。
<?php $arr=array(array(76,87,68), array(65,89,95), array(90,80,66), array(90,95,65),5,234,56,'Hello'); //定义一个二维数组 function ergodic($arr){ //定义遍历数组的函数 foreach($arr as $k=>$v){ if(is_array($v)){ echo "<br />数组元素{$k}中的元素:<br />"; ergodic($v); //递归调用 echo '<br />'; }else{ echo "{$k}=>{$v}<br />"; } } } ergodic($arr); //调用函数遍历数组 ?>
上述代码运行结果为:
数组元素0中的元素:
0=>76
1=>87
2=>68数组元素1中的元素:
0=>65
1=>89
2=>95数组元素2中的元素:
0=>90
1=>80
2=>66数组元素3中的元素:
0=>90
1=>95
2=>65
4=>5
5=>234
6=>56
7=>Hello
从运行结果我们可以看到,使用我们的自定义函数成功遍历了不规则的二维数组。其他遍历的方法这里就不再详讲,小伙伴们可以根据自己情况来自己编写。
3、三维数组
有了前面学习二维数组的基础,大部分读者一定能够推导出三维数组。三维数组即将多个二维数组作为元素的数组,通常的形式如下:
array(array(array(…)…)…)
三维数组可以存放更多的信息,例如一个学生有多个成绩,多个学生可以合成为一个班,多个班级可以合成为一个年级。那么我们就可以创建一个如下形式的三维数组来保存这些信息:
$grade=array('class1'=>array('stu1'=>array('yuwen'=>85,'shuxue'=>95,'yingyu'=>96),
'stu2'=>array('yuwen'=>76,'shuxue'=>89,'yingyu'=>99),
'stu3'=>array('yuwen'=>75,'shuxue'=>99,'yingyu'=>100),
...),
'class2'=>array('stu1'=>array('yuwen'=>99,'shuxue'=>100,'yingyu'=>100),
'stu2'=>array(...),
...),
'class3'=>array(...),
...
)
三维数组元素的访问同二维数组类似,通过如下的形式即可访问:
数组名[索引][索引][索引]
<?php //定义一个三维数组 $grade=array('class1'=>array('stu1'=>array('yuwen'=>85, 'shuxue'=>95,'yingyu'=>96), 'stu2'=>array('yuwen'=>76,'shuxue'=>89,'yingyu'=>99), 'stu3'=>array('yuwen'=>75,'shuxue'=>99,'yingyu'=>100)), 'class2'=>array('stu1'=>array('yuwen'=>99,'shuxue'=>100,'yingyu'=>100)), 'class3'=>array(array(80,90,99))); //访问数组中的元素 echo '该年级1班的stu1学生的yuwen成绩为:'.$grade['class1']['stu1']['yuwen']; echo '<br />该年级1班的stu3学生的yingyu成绩为:'.$grade['class1']['stu3']['yingyu']; echo '<br />该年级2班的stu1学生的shuxue成绩为:'.$grade['class2']['stu1']['shuxue']; echo '<br />该年级3班的学生0的成绩1为:'.$grade['class3'][0][1]; ?>
上述代码运行结果为:
该年级1班的stu1学生的yuwen成绩为:85
该年级1班的stu3学生的yingyu成绩为:100
该年级2班的stu1学生的shuxue成绩为:100
该年级3班的学生0的成绩1为:90
三维数组的其他操作方法都同一维数组和二维数组类似,这里陌小雨就不再详细讲解。
4、系统预定义数组
系统预定义数组同系统预定义常量类似,即这些数组是由系统定义的,我们可以直接来访问而无需定义,PHP中常用的预定义数组如下图所示。
这些数组的使用方法同普通数组的使用方法相同,这里就不再详细讲解。
5、小结
PHP的数组是非常强大的,因此陌小雨博客分了6篇文章尽可能详细地讲解到每一个知识点。数组中的索引数组是最常用的形式,因此花费了大篇的章节来讲解,这也是读者要掌握的主要部分。关联数组虽然可以使得数组看起来更加直观,但是在实际的使用过程中使用还是比较少的。应重点掌握索引数组以及相关数组的操作。