数组(array)是开发过程中非常常用的类型之一,这一篇主要来看看数组的一些基本操作。
定义数组
PHP 中定义数组非常简单,通过 array()
函数即可生成,数组中允许包含数组。
注意 : PHP 中数组分为索引数组和关联数组两种形式,这是针对数组的键而言的。关联数组在其他语言中也被称为字典(Dictionary)、映射(Mapping)等。
<?php
$arr1 = array(); // 空数组
$arr2 = array("A","B","123","中文"); // 自动维护索引的数组
$arr3 = array('name' => "Lucy", 'gender' => "female"); // 关联数组
?>
此外,还可以通过 array range(int low, int high [, int step])
函数快速创建数字元素的数组,参数 low
和 high
分别表示数组元素最小和最大值,可选参数 step
表示步进值,取值应当为正整数,默认为1。在 PHP 5 之前不存在此参数。
操作数组
更新元素
对于索引数组,数组中的元素可以通过下标操作,下标从0开始。
<?php
$arr1 = array(); // 空数组
$arr2 = array("A","B","123","中文"); // 自动维护索引的数组
$tmp = $arr2[0]; // 通过下标取出指定位置的元素
$arr2[1] = 'PHP'; // 通过下标为指定位置的元素赋值
$arr3 = array('name' => "Lucy", 'gender' => "female"); // 关联数组
$name = $arr3['name']; // 通过key取出指定元素
$arr3['gender'] = 'male'; // 通过key为指定元素赋值
?>
添加元素
<?php
$arr = array(); // 空数组
$arr[] = 'A'; // 添加元素
$arr[] = 'B';
$arr[] = 'C';
print_r($arr);
?>
删除元素
可以直接通过对数组的元素调用 unset()
函数进行销毁。
<?php
$arr = array('A', 'B', 'C');
unset($arr[1]);
print_r($arr);
?>
遍历元素
遍历数组中的元素有多种方式:
-
通过循环语句遍历,会在下一节《流程控制》部分中说明。
-
通过
void list(mixed ...)
和array each(array array)
遍历。
<?php
$arr = array('A', 'B', 'C');
while (list($key, $value) = each($arr)) {
echo "$key : $value"."\n";
}
echo "-----\n";
$arr2 = array('first' => 'A', 'second' => 'B');
while (list($key, $value) = each($arr2)) {
echo "$key : $value"."\n";
}
?>
排序元素
排序也是很常见的一种需求,PHP 中提供了一些函数用于简单排序。
-
void sort(array array[, int sort_flags])
-
void rsort(array array[, int sort_flags])
-
void asort(array array[, int sort_flags])
-
void arsort(array array[, int sort_flags])
其中,sort
/asort
从低到高排序,rsort
/arsort
从高到低排序。使用 sort
/rsort
排序时,可能会破坏键值对应关系,如果需要避免这种情况则应当使用 asort
/arsort
。
可选参数 sort_flags
,它的可取值有:
-
SORT_REGULAR
: 默认值,表示正常比较数组元素 -
SORT_NUMERIC
: 表示数组元素将被作为数字来比较 -
SORT_STRING
: 表示数组元素将被作为字符串来比较
此外还有一种不常用的排序方式——随机排序。可以通过函数 bool shuffle(array &$haystack)
实现。参数 haystack
表示要随机排序的数组。使用此函数后,数组的键都会被从0开始的连续整数替换。
是否包含元素
判断数组中是否包含某个元素,可以通过 bool in_array(mixed needle, array array[, bool strict])
函数实现,参数 needle
表示要查找的值,array
表示被检索的数组,可选参数 strict
表示检索时是否检查类型。
是否包含键名
类似的,我们也可以通过 bool array_key_exists(mixed key, array search)
函数来判断数组是否包含有某一键名。
元素计数
函数 int count(mixed array[, int mode])
用来统计数组的元素个数,其可选参数 mode
表示计数模式,取值 COUNT_RECURSIVE
(或1)表示递归计数,默认为0。
数组合并
要合并多个数组,可以使用 array array_merge(array array1, array array2 [, array ...])
函数实现,要求最少传入两个数组,也可以传入多个。返回值是合并后的数组。
数组拆分
要拆分一个数组,可以使用 array array_chunk(array input, int size [, bool preserve_keys])
函数实现,参数 input
表示要拆分的原始数组,size
表示拆分后每个数组的元素个数,可选参数 preserve_keys
表示是否保留原始键名,默认为 false
,即拆分后的每个数组都将用从0开始的连续整数索引。
数组反转
函数 array array_reverse(array input [, bool preserve_keys])
可以将一个数组的元素顺序前后反转,可选参数 preserve_keys
表示是否保留原始键名。
元素求和
函数 mixed array_sum(array array)
可以对数组中的元素进行求和。
键值对调
函数 array array_flip(array trans)
可以将数组中的键名与值对调,使键名成为值,值成为键名。如果同一个值多次出现,那么最后一次出现所对应的键名将作为对调后的值。