数组(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]) 函数快速创建数字元素的数组,参数 lowhigh 分别表示数组元素最小和最大值,可选参数 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) 可以将数组中的键名与值对调,使键名成为值,值成为键名。如果同一个值多次出现,那么最后一次出现所对应的键名将作为对调后的值。