简介
php中的数组每个元素都是一个"键-值"对,默认情况下数组内第一个元素的键为数值0,第二个元素键为数值1,依此类推,不过,php中的数组是可以为元素指定键的。应注意是,键的类型只能是整数或字符串,不能取其他类型。
php中,数组的定义相当自由,不仅键的数据类型不需要统一,值的数据类型也不需要统一,甚至维度都不需要统一:
$a['a'] = true;
$a[2] = 3;
$a[1]['b'] = "abc";
echo var_dump($a['a']); // bool(true)
echo var_dump($a[2]); // int(3)
echo var_dump($a[1]['b']); // string(3) "abc"
数组定义
要定义一个数组,实际上不需要什么特殊的语法,直接定义有一个具有下标的变量并对其赋值就可以了,例如:
$arr[3] = 4;
此外,还可以使用array()函数(及简写的方括号)进行定义:
$a = array();
$b = array('x1', 'x2');
$c = array(1=>'x1', 'a2'=>'x2', 3=>'x3');
$d = [];
$e = ['x1', 'x2'];
$f = [1=>'x1', 'a2'=>'x2', 3=>'x3'];
echo var_dump($a);
echo var_dump($b);
echo var_dump($c);
echo var_dump($d);
echo var_dump($e);
echo var_dump($f);
-----------------array(0) {
}
array(2) {
[0]=>
string(2) "x1"
[1]=>
string(2) "x2"
}
array(3) {
[1]=>
string(2) "x1"
["a2"]=>
string(2) "x2"
[3]=>
string(2) "x3"
}
array(0) {
}
array(2) {
[0]=>
string(2) "x1"
[1]=>
string(2) "x2"
}
array(3) {
[1]=>
string(2) "x1"
["a2"]=>
string(2) "x2"
[3]=>
string(2) "x3"
}
$a[2]['a'] = 'sa';
$a[2]['b'] = 'sb';
$a[3] = 4;
$b = array(array(1,2,3), array(4,5,6)); // 也可以使用=>运算符指定键名
$c = [[1,5=>2,3],[3=>4,5,6]]; // 注意键名的自动分配
echo var_dump($a);
echo var_dump($b);
echo var_dump($c);
--------------------array(2) {
[2]=>
array(2) {
["a"]=>
string(2) "sa"
["b"]=>
string(2) "sb"
}
[3]=>
int(4)
}
array(2) {
[0]=>
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
[1]=>
array(3) {
[0]=>
int(4)
[1]=>
int(5)
[2]=>
int(6)
}
}
array(2) {
[0]=>
array(3) {
[0]=>
int(1)
[5]=>
int(2)
[6]=>
int(3)
}
[1]=>
array(3) {
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(6)
}
}
注意,php中数组元素的类型是不需要统一的,在本例中,数组$a的元素$a[2]是一个数组,具有['a']和['b']两个元素,而$a[3]只是一个整数。
数组的键
数组的键可以是常量或变量:
$a = 'x1';
$b[$a] = 3;
echo var_dump($b['x1']); // int(3)
数组的键只能是整数(包括正数、0和负数)或字符串类型,如果是其他类型,会以以下规则自动进行转换:
1.包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。 这也意味着键1和键"1"是不能共存的,尽管键支持整数和字符串类型。
2.浮点数也会被转换为整型。
3.布尔值也会被转换成整型。true转换为1,false转换为0。
4.null 转换为 ""。
5.数组和对象不能被用为键名。
$a = [1=>2, '1'=>4, 'a'=>'x', false=>'y', null=>'z'];
echo var_dump($a);
---------------------array(4) {
[1]=>
int(4)
["a"]=>
string(1) "x"
[0]=>
string(1) "y"
[""]=>
string(1) "z"
}
$a = [1,2,5=>3,4];
var_export($a);
--------------------
array (
0 => 1,
1 => 2,
5 => 3,
6 => 4,
)
给数组元素赋值
如果给元素赋了值但没有给元素的键赋值时,例如"arr[] = 100;",那么默认的键为数组内最大的整数键加1,如果数组内没有正整数的键,那么默认的键为0。注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 删除其中的所有元素:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一个单元,新的键名会是5而不是0
$array[] = 6;
print_r($array);
// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
--------------------Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)
可见,重新索引后,原来键为5的值6,现在变成键0了。此外,除了中括号[]之外,也可以使用花括号{}来存取数组的元素。
如果使用下标对一个变量赋值,将会发生以下情况:
1.如果变量未定义,则定义此变量,类型为数组
2.如果变量已定义,且为数组,则向此数组修改或添加元素
3.如果变量已定义,但不是数组,则无效果
$a = "abc";
$b = ["abc"];
$a[2] = "def";
$b[2] = "def";
var_dump($a);
var_dump($b);
--------------------
string(3) "abd"
array(2) {
[0]=>
string(3) "abc"
[2]=>
string(3) "def"
}
将数组元素依次赋给一组变量
可通过list()函数便捷地将一组数组元素赋给一组变量
$a = array(1,2,3,4,5,6);
list(,,,$x,$y) = $a;
var_dump($x); // int(4)
var_dump($y); // int(5)
删除数组元素
数组元素可通过unset()函数从数组中移除
但unset()函数只是删除数组元素,并不会重建索引。如果需要删除后重建索引,可以再调用一次 array_values() 函数
$a[0] = 1;
$a[1] = 2;
$a[2] = 3;
unset($a[1]);
var_dump($a);
---------------------array(2) {
[0]=>
int(1)
[2]=>
int(3)
}
常数数组
define()函数可用于定义常数数组,例如:
define('ARR', [1,2,'a']);
echo var_dump(ARR);
array(3) {[0]=>
int(1)
[1]=>
int(2)
[2]=>
string(1) "a"
}
类中同样可以使用const来定义常量数组:
class foo
{
public const str = [1,2,3];
}
echo foo::str[0];
运算符
数组支持的运算符包括:
+、==、===、!=、<>、!==、+=
数组加法(+)
数组的加法运算将得到一个新的数组,新数组的键值为各操作数数组的键值的并集。对于同名键值,以收集到的第一个元素为有效。也就是右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。
$a = array(1, 2);
$b = array(3, 4, 5, 6);
$c = array(7, 8, 9);
$d = ($a + $b + $c);
var_dump($d);
--------------------
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(5)
[3]=>
int(6)
}
$a = array('a'=>1, 2);
$b = array(3, 4, 5, 6);
$c = array(7, 8, 'b'=>9);
$d = ($a + $b + $c);
var_dump($d);
--------------------array(6) {
["a"]=>
int(1)
[0]=>
int(2)
[1]=>
int(4)
[2]=>
int(5)
[3]=>
int(6)
["b"]=>
int(9)
}
相等运算符(==),两个数组有相同的元素(键和值)时,结果为true
全等运算符(===),两个数组有相同的元素且顺序相同、类型也相同时结果为true
$a = array(0=>1, 1=>2);
$b = array(1=>2, 0=>1);
$c = array(1, 2);
var_dump($a == $b); // true
var_dump($a === $b); // false
var_dump($a == $c); // true
var_dump($a === $c); // true
不等运算符包括!=和<>,两者作用相同。