
第三章 不一样的数组
几乎所有的语言都原生支持数组,PHP也不例外!在本章中我们首先要对数组的一些基础知识进行回顾和熟悉,然后把PHP中有关数组的常用操作整理和归纳以便后面章节中学习使用。与基础学习不同的是我们将引入 SplFixedArray 的相关内容并对比普通数组学习这部分的内容。最后实现我们第一个数据结构--连续的线性表!当然还会附加一个PHP数组常用函数的总结说明。
让我们先对本章内容做一个概览。
本章内容如下:
- 数组的定义
- 数组的分类
- 数组的常用操作
- 数组的遍历
- SplFixedArray数组
- 线性表的实现
- 数组函数
3.1 PHP数组定义
我们直接拿官方手册上的定义放在这里
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
上面是官方手册对PHP中数组的定义说明。不过我相信大家对于PHP数组有更加深刻的认知,特别是在使用层面上讲,这里我就简单的列出几条供大家参考,更多的内容能够大家可以结合实际应用经验自己补充。
- PHP数组使用前不用预定义长度。
- PHP数组的长度会随着数据增删动态改变长度!
- PHP数组是弱类型的,同一个数组可以存储不同类型的值。
- PHP数组的下标可以是整型也可以是字符串。
- php数组按照插入顺序存储元素。
- PHP数组普通删除元素(unset)后不会重新建立索引。
- PHP内置函数的增删操作会得到重新索引后的数组。
由于存在以上这些特征使得PHP的数组使用非常灵活,甚至有些“独树一帜”。
3.2 PHP数组分类
PHP中数组实际上可按照不同的标准来分类。
3.2.1 按照数组下标类型来分
- 索引数组 : 又称为整型数组,数组的下标索引是整数类型,默认从0开始;
- 关联数组 : 类似字典结构,数组的下标是字符串类型的。
3.2.2 按照数组的维度来分
- 一维数组 : 数组每个元素都是非数组类型的值。
- 二维数组 : 数组中至少有一个元素的类型是一维数组,并且每一个元素若是数组类型其维度不超过一维。
- 多维数组 : 数组中至少有一个元素值是二维或者更多维度的数组类型。
3.2.3 按照实现方式不同来分
- PHP内置数组类型。
- SplFixedArray数组类型。
3.3 PHP内置数组的常用操作
3.3.1 初始化
所谓的初始化就是在使用之前要先声明变量的类型及初始状态的值。PHP内置数组类型在使用之前是不要求一定要初始化的,我们可以在需要的时候直接使用。
定义一个数组变量$arr, 并将值[1,2,3,4,5]赋予该变量
$arr = [1,2,3,4,5];
实际上上面代码的使用过程已经包含了初始化的过程。我们也可以把初始化过程给拿出来:
$arr;
$arr = [1,2,3,4,5];
当然了,我们有很多情况是需要初始化,例如我们要使数组函数对一个变量进行处理,但是赋值操作有可能没有正常完成,这样就必须初始化了!而且面向对象编程中,有很多成员属性也需要初始化,数组初始化成空数组就可以了,如下:
$arr = [];
Tips 初始化的两个作用: 1, 指定该变量的类型,尤其是需要使用内置函数处理变量前,一定要初始化! 2, 指定变量的默认值。
3.3.2 增加元素
我们这里就以一维数组为例来进行说明,首先还是让我们来初始化一个数组,这样下面就能使用了!
$arr = [];
在数组的尾部进行添加
方式一: 直接对 $arr[] 赋值, 原因是PHP数组的下标会自动增长:
$arr[] = 1;
方式二: 使用PHP内置函数array_push();
返回值:添加元素后数组的长度
语法:array_push(数组变量, 值)
栗子:
array_push($arr, 1);
Tips 推荐使用第一种方式,因为第二种方法毕竟是调用了一个函数,会造成额外的负担。
在数组的头部进行添加
方式一: 使用PHP内置函数array_unshift();
返回值:添加元素后数组的长度
语法:array_unshift(数组变量, 值)
栗子:
array_unshift($arr, 1);
在数组的任意位置进行添加
方式一: 使用PHP内置函数array_splice();
返回值:添加元素后数组的长度
语法:array_splice(数组变量, 位置, 0, 值)
栗子:
array_splice($arr, 1, 0, 1);
3.3.3 删除元素
删除头部元素
方式一: 使用PHP内置函数array_shift();
返回值:被删除的第一个元素
语法:array_shift(数组变量)
栗子:
array_splice($arr);
方式二: 使用PHP内置函数array_splice();
返回值:被删除的第一个元素
语法:array_shift(数组变量, 0, 1)
栗子:
array_splice($arr, 0, 1);
删除尾部元素
方式一: 使用PHP内置函数array_pop();
返回值:被删除的元素
语法:array_pop(数组变量)
栗子:
array_pop($arr);
方式二: 使用PHP内置函数array_splice();
返回值:被删除的元素
语法:array_shift(数组变量, -1)
栗子:
array_splice($arr, -1);
删除任意位置元素
方式一: 使用PHP内置函数array_splice();
返回值:被删除的元素
语法:array_shift(数组变量, 要删除的位置, 要删除的个数)
栗子:
从第一个元素开始,删除5个连续的元素
array_splice($arr, 0, 5);
删除从倒数第5个开始连续的3个元素
array_splice($arr, -5, 3);
3.4 PHP数组的遍历
所谓“遍历”是指对指定范围内的数组元素按照某种条件依次进行查询的操作!我们这里,是对整个数组的所有元素从头至尾进行查询并输出的过程!
数组的遍历是非常常用的也非常实用的一种操作,无论是在实际项目还是在学习过程中,我们都应该熟练的掌握各类数组的各种遍历方案。这里提到了“各种遍历方案”,确实要实现数组的遍历,方法还是多种多样的,每种方法都有自己的适用场景以及优缺点。我们这里不是研究PHP的基本语法,更多具体的操作可以参考其他书籍或者资料进行学习!我们这里就几种常用的方案进行说明和对比!
3.4.1 使用 for + count 实现
基本思路是使用count方法获取数组的长度,然后在不越界的情况下使用for循环数组的索引位置来遍历数组元素。由于该方法是利用的数组数字索引来关联数组元素,所以这种方案仅能支持具有连续索引的索引数组!并且如果某个元素被unset掉,也会引起遍历的失败【Notice: Undefined offset:未找到指定的索引】,这是由于PHP数组并不会自动重新索引下标!
代码示例
$arr = [1, 2, 3, 4, 5];
$arrLength = count($arr);
for ($i = 0; $i < $arrLength; $i++) {
echo $arr[$i];
}
3.4.2 使用 foreach 实现
使用foreach不仅可以遍历数组,还可以遍历对象。使用foreach方法遍历是最常用的方案。并且使用foreach遍历,既可以是关联数组也可以是索引数组!也不用再考虑数组的下标是否连续,是否有元素被unset掉等操作!
代码示例
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $key => $value) {
echo $key, " : ", $value;
}
3.4.3 使用 while + list + each 实现
这个是利用了PHP的内部指针来辅助实现的!基本的思路是首先复位数组的指针,然后每执行一次each,数组内部的指针就会自动向下一个元素移动一步!这样使用循环直到数组的末尾!
代码示例
$arr = [1, 2, 3, 4, 5];
reset($arr);
while (list($key, $value) => each($arr)) {
echo $key, " : ", $value;
}
当然出去这些遍历方法,还有很多其它的方法,大家可以好好找到相关资料,继续研究! 下面咱们来一起了解一下PHP的SPL库中提供的一种效率更高的数组--SplFixedArray!
3.5 SplFixedArray数组简介及简单应用
未完,待续。。。。。。