PHP的数组可以说是所有语言里面最有意思的。尽管数组的概念并非PHP首创,但是PHP的数组与传统意义上的数组不太一样。为什么呢?因为PHP的数组,既可以指代C-Like的数组、Java的数组/列表(严格意义上Java的列表List属于接口,不属于具体类型)、Python的列表,也可以指代Java中的map。因此,PHP的数组在其他语言中可能是多种类型或者不存在某一种形式,在学习其他语言的时候,尽量不要带入PHP数组的概念,否则容易误入歧途。
在前面几次课程中,我们也接触了PHP数组的概念,这里就不再多提。PHP数组不仅仅表面的那么简单,因为PHP官方提供了海量的array处理函数。事实上,PHP官方也提供了相应的文档:https://www.php.net/manual/zh/book.array.php
本节课,我将挑选最常用的几个实用处理函数来进行讲解,此后也可以翻阅该课程或官方文档来快速查找用法。
array_fill
这个函数用于生成填充某个指定的值的数组,定义如下:
array_fill ( int $start_index , int $num , mixed $value ) : array
$start_index:开始填充的数组下标,可以为负数
$num:填充的个数
$value:填充的值
返回值:填充后的数组
学过matlab的同学都知道,这个函数跟ones和zeros很像,不过array_fill是可以指定某个值的,且不能直接基于一个值生成二维数组(矩阵)。它的作用一般是实现生成一个默认的数组,然后根据某些条件再更改某个下标的元素值。
array_filter
这个函数用于过滤指定条件的元素,并生成过滤后的数组,定义如下:
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
$array:原数组
$callback:回调函数,用于指定过滤条件,return true则会包含元素,return false则会去掉元素;如果不提供该参数,将删除 array 中所有等值为 false 的元素(如0 null false等,具体看转换为布尔值)
$flag:决定callback接收的参数形式:
ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数
ARRAY_FILTER_USE_BOTH - callback同时接受键名和键值
如何使用?PHP官网有一个很好的例子,点击这里前往。
这里重点提及一下$flag对$callback的影响。如果flag=ARRAY_FILTER_USE_KEY,那么callback的参数只有一个,那就是数组的键名;如果flag=ARRAY_FILTER_USE_BOTH,那么callback可以接收两个参数,第一个是键名,第二个是键值。
array_key_exists
它的出镜率不亚于isset,因为使用它更加准确。Why?isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会。如果要准确侦测键名是否存在,使用它是首选项。
定义:
array_key_exists ( mixed $key , array $array ) : bool
$key:待检测键名
$array:待检测数组
返回值:是否存在键名(布尔型)
用途很明确了,这里就不提了。
array_merge
这个函数用于合并具有重复键名的元素,出镜率也是很高的。定义:
array_merge ( array $array1 [, array $... ] ) : array
参数个数是可变的,后面的数组元素会覆盖前面有重复键名的元素,一般用于系统给定一个默认设置,由用户传入自己的设置后覆盖掉系统中对应的默认设置,用户没有设置的则使用默认设置。这样可以简化函数/方法的参数个数(在Java中一般是传入对象来简化参数)。
array_pop/array_push
学过堆栈的同学,一定明白这两个函数的作用。这涉及到数据结构的知识,请大家自行学习堆栈的知识。
array_pop ( array &$array ) : mixed
$array:待弹栈的数组
返回值:弹出的元素
仔细看参数,可以发现用了引用符号,也就是说,array_pop函数会直接对数组操作,移除最后一个单元。array_push同理:
array_push ( array &$array , mixed $value1 [, mixed $... ] ) : int
这个函数可以同时压入多个值,因此参数个数是可变的。返回值表示压入的元素个数。
至于怎么应用,这个大家自行摸索,用途很广泛的。也有队列的函数,可以自己去官网查找。
array_rand
从数组中随机选一个键名
array_rand ( array $array [, int $num = 1 ] ) : mixed
$array:数组
$num:选多少个
返回值:一个或多个键名,取决于$num。
array_search
搜索数组元素值并返回对应的键名
array_search ( mixed $needle , array $haystack [, bool $strict = false ] ) : mixed
count
计算数组中的单元数目,或对象中的属性个数
count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] ) : int
这个函数很常用,但是很简单,就不详细说明了。
虽然还有很多有意思的函数,但是常用的基本上就是array_filter/array_key_exists/array_merge/count,大家记住这4个函数,PHP数组基本能运用自如。话虽如此,其他函数也会在特殊的地方发挥作用,如果你想实现一个关于数组的功能时,记得去看看PHP官网上记载的关于数组的函数列表,能用自带的尽量用自带的,重复造轮子效率可能还不如官方的方案。
这节课讲得比较简单,因为PHP中淡化了类型、指针等概念。顺便一提,PHP中数组是作为基本类型存在的,也就是说,参数的数组其实是值传递,与C/C++的指针传递是不同的,要想对数组参数的原数组进行改动,必须使用引用参数。