数组也许是至今来说对于PHP开发者来说数据组织能力最强工具。因此,学好它可以为成为一名优秀的开发者打下基础。
当然,对于通过考试来说,你也没有必要把手册中关于数组的知识完全掌握,但是对于在学习时适当的做一些笔记是非常重要的:因为数组常被用来操作庞大数量的数据,对此PHP的内建函数的运行效率绝对会比任何自定义函数来的高,因此,可以给程序带来良好的运行效率与可伸缩性。
数组常被当作堆栈(后进先出:LIFO)与队列(先进先出:FIFO)结构来使用。PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素。
PHP核心提供了总共11个函数用来处理各种不同的数组排序需求。最简单也是最直接的是使用sort(),来对数组中元素进行基于值的排序:
$array = array('a' => 'foo', 'b' => 'bar', 'c' => 'baz');
sort($array);
var_dump($array);
就像看到的那样,sort()改变的数组原始变量,参数通过引用传递。这就意味着只能传入变量,而不是直接量。
执行结果如下:
array(3) {
[0]=>
string(3) "bar"
[1]=>
string(3) "baz"
[2]=>
string(3) "foo"
}遍历数组是数组最常见的操作之一。与其他语言的数组的连续索引的特性不同,PHP提供了对松散机制的数组的支持,因为普通的循环无法遍历那些键值不连续的数组。试想下例:
$a = array ('a' => 10, 10 => 20, 'c' => 30);
很明显,我们学过的尚无应付以上数组遍历操作的循环结构——除非,你很清楚数组中所有元素的键值,手动操作来实现遍历将是非常痛苦的。
(Siemen注:本章学习的就是如何使用PHP对于松散的数组提供的支持)
还记得我们在第一章的“PHP基础”中提到的,许多操作符对作用于数组的效果是与众不同的。比如加号操作符 + 可以用来合并两个数组:
$a = array (1, 2, 3);
$b = array ('a' => 1, 'b' => 2, 'c' => 3);
var_dump ($a + $b);
输出结果如下:
array(6) {
[0]=>
int(1)
[1]=>
int(2)
[3]=>
int(3)
["a"]=>
int(1)
["b"]=>
int(2)
["c"]=>
int(3)
}
那么为什么即使两个数组中元素的值都是相同的而,输出的结果会是两个数组变量中所有元素的集合;原因就是他们的键值不同——如果是相同键值(无论是整数还是字符),那么靠后的操作数中的同键元素将会覆盖相对靠前的同键元素:
$a = array(1, 2, 3);
$b = array('a' => 1, 2, 3);
var_dump($a + $b);
结果如下:
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[3]=>
int(3)
["a"]=>
int(1)
}
数组中元素的意义是存放变量。每个元素存放一个值,且用一个键值指向它。正如我们上一节所介绍的,键值可以是整数或者任意长度的字符。
有两种方式可以创建一个数组。第一种是显式地调用array()语法结构:
$a = array (10, 20, 30);
$a = array ('a' => 10, 'b' => 20, 'c' => 30);
$a = array (5 => 1, 3 => 2, 1 => 3,);
$a = array();
以上的第一行代码创建了一个仅包含三个值的数组。这样的话,其中每个元素仍然有它自己的键值,PHP会为其中每一个没有指定键的元素自动加上以0开始的键。在第二个例子中,同样是三个元素,但期每一个键都被指定了一个字母左右键值(特别提醒的是字母键值长度可以任意)。第三个例子中,键值打破常规自增,第一个元素的键值是5——需要提醒的是最后一个逗号后面没元素,这在语法上是允许的,且不会影响到最终结果。最后的第四例创建了一个空的数组。
那么第二种创建数组的方法是使用数组操作符“[]”:
$x[] = 10; $x['aa'] = 11; echo $x[0]; // 输出10
正如你看到的,使用操作符直接创建数组要比array()去创建数组来的高效的多:在第一行中,我们向数组变量$x中添加了一个新的值。由于我们没有给出键值,PHP会自动将其下一个自动编号的键值赋给这个新的数组元素。在第二行中,我们指定了一个’aa’作为键值添加到数组变量$x中。需要提醒的是,我们并没有明显指定$x是一个数组,可以这样使用意味着PHP会将其自动转换成数组供我们使用,除非它本身就是数组。如果$x是空的,那仅仅被转换成一个空的数组。
数组是PHP中无可争议的高级数据结构之王。PHP中的数组异常松散——允许数值自增键、字母键甚至两者混合,且可以存放任何类型的值(包括存放其他数组)。拥有超过70个方法可以操作数组,几乎你能想得到的一定能能做得到——而且远不止此。
函数时PHP语言中最常用的组件(或许这适用于任何语言)。没有了它,编写重用代码几乎不可能办到——更别说面向对象开发技术了。
因此,你必须精通函数而非略懂皮毛,并且了解引用传参和可变个数传参。考试中会遇到不少围绕函数工作原理的问题——幸运的是这些概念相对简单且易于理解,在本章中都有讲到。