几乎任何一门编程语言都有数组,它是计算机编程中最常见的数据结构。因为数组是编程语言自带的,通常效率很高,能够满足不同需求的数据存储。让我们来学习 PHP 中数组的工作原理,以及使用的场景。
PHP 中数组的定义
首先我们了解下,数组的标准定义:数组,是有序的元素序列,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。
PHP 中的数组实际上是一个有序映射。映射是把 values 关联到 keys 的类型。这个类型在很多方面做了优化,因此可以把它当成是真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。另外,数组元素的值也可以是另一个数组,树形结构和多维数组都是可以的。
使用数组
PHP 中的数组很强大。有多种创建和存取元素的方法,也可以通过不同的方式对数组进行查找和排序。同时还提供了一系列函数,方便对数组做各种各样的操作。
创建数组
最简单的方式是使用 array() 或 [] 语言结构来创建一个数组变量:
<?php
$array = array();
$array = [];
使用这种方式创建数组,你将得到单元数量为 0 的空数组。可以通过内建的 count
方法来验证这一点:
$ php -r "echo count(array());"
0
另外,创建数组的时候还可以直接放入一组元素:
<?php
$array = array(1, 2, 3, 4, 5);
$array = [1, 2, 3, 4, 5];
echo count($array); // 5
在 PHP 中,数组中的元素可以是任意类型的值,这个和很多编程语言不同,如下所示:
<?php
$array = [1, 'apple', true, null];
可以使用 is_array
函数来判断一个对下是否是数组,如下所示:
<?php
$number = 3;
$array = [8, 16, 32];
var_dump(is_array($number)); // bool(false)
var_dump(is_array($array)); // bool(true)
我们讨论了创建数组的几种方式,其中从 5.4 起可以使用短数组定义语法,用 [] 代替 array()。
读取数组
在一条赋值语句中,可以使用 [] 操作符将数据赋值给数组,比如下面的循环,将 1~100 的数字赋值给一个数组:
<?php
$numbers = [];
for ($i = 0; $i < 100; $i++) {
$numbers[$i] = $i + 1;
}
还可使用 [] 操作符读取数组中的元素,如下所示:
<?php
$array = [1, 2, 3, 4, 5];
$sum = $array[0] + $array[1] + $array[2] + $array[3] + $array[4];
echo $sum; // 15
如果要依次读取数组中的所有元素,使用 for
循环会更加简单:
<?php
$numbers = [1, 3, 5, 9, 15, 18, 26];
$sum = 0;
for ($i = 0; $i < count($numbers); $i++) {
$sum += $numbers[$i];
}
echo $sum; // 77
其中,我们使用 count
函数来控制循环次数,count
可以计算出数组中的单元数目,从而确保循环遍历了数组中的所有元素。
由字符串生成数组
使用字符串函数 explode
可以用一个字符串分隔另一个字符串,该方法通过一些常见的分隔符,比如分隔单词的空格,将一个字符串分成几部分,并将每部分作为一个元素保存到一个新建的数组中。
下面一个小程序演示了 explode
方法的工作原理:
<?php
$sentence = 'Hi zhanbai, I like this book!';
$words = explode(' ', $sentence);
for ($i = 0; $i < count($words); $i++) {
echo 'word ' . $i . ': ' . $words[$i] . PHP_EOL;
}
输出:
word 0: Hi
word 1: zhanbai,
word 2: I
word 3: like
word 4: this
word 5: book!
另外,str_split
函数也可以将字符串转换为数组,不同的是它是通过设定元素的长度进行分割。preg_split
函数可以通过一个正则表达式分隔字符串为数组。
对数组的整体性操作
有些操作是将数组作为一个整体进行的。首先,可以将一个数组赋给另一个数组:
<?php
$numbers = [];
for ($i = 0; $i < 10; $i++) {
$numbers[$i] = $i + 1;
}
$same_numbers = $numbers;
当把一个数组赋值给另一个数组时,相当于创建了一个新的数组,当你修改了赋值数组的值,被赋值的数组并不会改变。下面的代码展示了这种情况:
<?php
$numbers = [];
for ($i = 0; $i < 10; $i++) {
$numbers[$i] = $i + 1;
}
$same_numbers = $numbers;
$numbers[0] = 20;
echo $same_numbers[0]; // 1
如果我们想要被赋值的数组随着原数组的改变而改变,可以使用引用赋值的方式,简单的将一个 &
符号加到要赋值的数组前(源数组):
<?php
$numbers = [];
for ($i = 0; $i < 10; $i&