本文是 PHP 入门系列文章的第二篇
建议先看上一篇文章:PHP从基础到入门(三)
数组基础知识
意义:
数组是按照既定顺序排列成“链状”的数据集合。
注意:PHP 中数组元素的顺序和下标无关!
数组定义(赋值):
$arr1 = array(3, 11, 5, 18, 2 ); //这个是最常见的数组,下标是“默认下标”,是从0开始的整数;
$arr2 = array("a"=>3, "bb"=>11, "cc123"=>5, 'd1'=>18, 'xyz'=>2); 关联数组,下标为字符串,常用
$arr3 = array(1=>3, 10=>11, 3=>5, 0=>18, 88=>2 ); 下标可以手动给出;
$arr4 = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2 ); 下标可以与数字和字符串混合;
$arr5 = array(5=>3, 11, 3=>5, 'mn'=>18, 2 ); //既有指定下标,也有“自动下标”。
//下标为:5, 6, 3, "mn", 7
//可以看出自动下标为“前一个最大数字下标+1”
$arr6 = array(5=>3, 7.7=>11, 3=>5, 'mn'=>18, 2 ); //下标分别为:5, 7, 3, "mn", 8
$arr7 = array(5=>3, true=>11, false=>5, 'mn'=>18, 2 ); //下标分别为:5, 1, 0, "mn", 6
$arr8 = array(1=>3, 3=>33, true=>11, ); //此时下标为:1,3,对应的值为:11,33
//若下标重复,则后一个值会覆盖前一个值;
$arr9 = array(1=>3, -3=>33, 11, ); //下标为:1,-3,2。注意:最后一个逗号“可以存在”。
其他一些形式:
$arr10[] = 3;
$arr10[] = 11;
$arr10[] = 5; //数组下标分别为0,1,2,正常情况
$arr11['a'] = 3;
$arr11['bb'] = 11;
$arr11['cc123'] = 5; //数组下标分别为'a','bb','cc123',正常情况
$arr12[1] = 3;
$arr12[] = 11; //此时下标为2
$arr13['cc123'] = 5; //数组下标为1,2,'cc123'
特别注意:在PHP中,数组元素的顺序是由“放进去”的顺序决定的,而不是下标。
数组值:
$v1 = $arr1[0];
$i = 3;
$v2 = $arr1[$i]; //获取数组中索引 3 的单元格的值;
一般来说,获取数组中单元格的值与获取变量的值完全相同!
阵列的分类
根据键值关系:
索引数组:一般认为,如果一个数组的下标都是从0开始的严格连续的整数,就称为索引数组——类似js数组的下标。例如:
$arr1 = array(3, 11, 5, 18, 2 ); //这个是最常见的数组,下标是“默认下标”,是从0开始的整数;
关联数组:一般认为,如果一个数组的下标是一个“字符串”,且在某种程度上代表了单位的“含义”,则称为关联数组,例如:
$conf = 数组(
‘主机’=>“”,
‘端口’=>3306,
''=>'根',
'' => '123' ,
(英文):
混合数组:既有数字下标,又有字符下标:
$arr4 = array(1=>3, 'a1'=>11, 3=>5, 'mn'=>18, 88=>2 ); 下标可以与数字和字符串混合;
根据数组的维度(复杂度):
一维数组:
$a = 数组(1, 11, 111);
$b = 数组(2, 22, 222);
$c = 数组(3, 33, 333);
二维数组:
$dd = 数组(
数组(1,11,111),
数组(2,22,222),
数组(3,33,333)
(英文):
多维数组:无非就是继续用数组代替。
数组的基本使用
求一维数组的平均值:
求二维数组的平均值:
查找一维数组的最大值:
求一维数组最大值与最小值的交换位置:
关于阵列交换还有两句话:
$a = array( 3, 11, 5, 7, 20, 18); //下标为 0, 1, 2, 3, 4, 5
要求 1:交换数组的第 0 项和第 3 项:
$v1 = $a[0];
$v2 = $a[3];
$t=$v1;
$v1 = $v2;
$v2 = $t; //这个做法根本行不通,因为v1和v2只是两个变量,和数组没有任何关系!
正确的做法是:
$t = $a[0];
$a[0] = $a[3];
$a[3] = $t;
要求2:交换数组的第一项和最后一项:
$pos1 = 0; // 第一项下标
$pos2 = count($a) - 1; //最后一项的下标
$t = $a[$pos1];
$a[$pos1] = $a[$pos2];
$a[$pos2] = $t;
要求3:交换数组的最大项与最小项:
$ = ....; //经过一些计算,得到最大项的下标;
$ = ....; //经过一些计算,得到最小项的下标
$t=$a[$];
$a[$] = $a[$];
$a[$] = $t;
数组遍历
基本语法
( $array 变量名称为【$key =>】 $value ){
//循环体;这里可以“使用”$key 和 value;
//$key和$value就是通过一遍遍遍历语句得到的数组每个单元(item)的索引和对应的值。
// 而且,它总是从数组的开头按顺序获取数据。
数组指针操作及遍历原理:
首先我们来看一下数组的“图像”:
$arr4 = 数组(1=>3,'a1'=>11,3=>5,'mn'=>18,88=>2);
可以形象地理解为:
数组下标:
“a1”
“嗯”
88
对应数据:
11
18
箭头就是数组内部所谓的“指针”,注意它是不可见的,无法输出,只是为了辅助理解的图形!
阐明:
1.箭头就是数组内部所谓的“指针”。
2.默认情况下,指针指向数组的第一个元素。
3.对数组元素的操作,如果没有指定下标,则对指针指向的元素进行操作。
4.所谓遍历,其实就是一次次的获取当前单元的key和value,放入对应的变量$key,$value中,然后移动指针到下一个单元。
那么,数组作为一个“一般的数据单位”,有如下指针操作函数可用:
1、$v1 = ($array); //获取数组中单元格的“值”作为指针;
2、$v2 = key($array); //获取数组中单元格的“键”(下标)作为指针;
3、$v3 = next($array); //先将数组的指针移动到下一个(最后一个)单元,然后获取新单元的值;
4、$v4 = prev($array); //先将数组的指针移动到前一个单元,然后获取新单元的值;
5、$v5 = end($array); //先将数组指针直接移动到最后一个单元,然后获取新单元的值;
6、$v6 = reset($array); //先将数组指针直接移动到第一个单元,然后获取新单元的值;
遍历过程示意图:
( $array 变量名称为 $key => $value ) {
//循环体;这里可以“使用”$key 和 value;
//$key和$value就是通过一遍遍遍历语句得到的数组每个单元(item)的索引和对应的值。
// 而且,它总是从数组的开头按顺序获取数据。
基本原理图如下:
输出为:
可以看出,遍历完之后,指针已经超出了数组的合理位置。
使用 for 和 next 迭代数组
注意:对于 PHP 数组,通常不能简单地使用 for 循环来遍历它们。
换句话说:在PHP中,for循环只能循环“纯整数下标连续的数组”;
结果:
each() 函数的使用
each()的作用是先取得一个数组的“当前单元”的下标和值(并放入数组中),然后移动指针指向下一个单元。
使用形式:
$a = each($array name); //现在 $a 是一个数组
使用 list() “函数”:
list()函数用于一次性获取数组中多个单元格的值,这些单元格的数值下标从0开始!
形式:
列表($变量1,$变量2,$变量3,..)= $数组;
影响:
上面这行代码等同于下面的代码:
$变量1 = $数组[0];
$变量2 = $数组[1];
$变量3 = $数组[2];
........
注意:这里的变量个数必须和数组数值下标的单元格对应,如果某个变量对应的数值下标不存在,则会报错!
while+each()+list() 遍历数组
关于数组变量的一些细节
它也是一个普通的循环语法结构,可以有break等操作。
遍历过程中传递值变量的默认方式是按值传递。
结果是:
遍历过程中,可以手动将value变量设置为引用传递: ($arr as $key => &$value) { ... }
结果是:
默认情况下,循环是在原始数组上执行的。但是,如果在循环过程中对数组进行了某些修改或指针操作,则会复制该数组,并在复制的数组上继续循环(原始数组保持不变)。
下面演示一下“默认遍历原始数组”的效果:
然后论证了在某些情况下(修改或者指针操作),原始数组不会被遍历。
结果是:
如果值变量是通过引用传递的,则它总是在原始数组上执行。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。