enter image description here

第三章 不一样的数组

几乎所有的语言都原生支持数组,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数组简介及简单应用

未完,待续。。。。。。