PHP中array的特性、用途、树形及多维结构介绍与语法定义讲解

PHP 中的 array 实际上属于一种有序映射。映射这种类型能够将 values 与 keys 关联起来。此类型针对多种不同的用途进行了优化。它既可以被看作数组,也可以被看作列表(向量),还可以被看作哈希表(映射的实现)、字典、集合、堆栈、队列等等。因为 array 的值可以是其他的 array,所以树形结构和多维 array 是被允许的。

PHP中array的特性、用途、树形及多维结构介绍与语法定义讲解

这些数据结构的解释超出了本手册的范畴,然而对于每种结构,至少会给出一个示例。若想获取这些数据结构的更多信息,建议参考有关此广泛主题的其他文献。

语法定义数组array()

可以用 array() 语言结构来创建一个新的数组。它能够接受任意数量且用逗号分隔的键(key)与值(value)的对应关系。

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

最后一个数组单元之后的逗号是可以省略的。这种情况通常出现在单行数组定义中,比如常见的是 array(1, 2),而非 array(1, 2, )。而对于多行数组定义,通常会保留最后一个逗号,这样在要添加一个新单元时会更加方便。

注意:可以用短数组语法[]替代array()。

示例 #1 一个简单数组

 "bar",
"bar" => "foo",
);
// 使用短数组语法
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>

key 可以是 integer 类型,也可以是 string 类型。value 能够是任何类型。

此外key会有如下的强制转换:

在数组定义时,若多个元素使用了相同的键名,那么最终只有最后一个元素会被使用,而其他元素都会被覆盖。

示例 #2 类型转换与覆盖的示例

 "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>

以上示例会输出:

array(1) {
  [1]=>
  string(1) "d"
}

上例中所有的键名都被强制转换为 1 了。这样一来,每一个新单元都会把前一个的值给覆盖掉。最后就只剩下一个“d”了。

PHP 数组能够同时包含 int 类型的键名和 string 类型的键名。这是因为在 PHP 中,实际上并不会对索引数组和关联数组进行区分。

示例 #3 混合int和string键名

 "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>

以上示例会输出:

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

如果未指定 key,PHP 会自动将之前用过的最大 int 键名加上 1 作为新的键名。

示例 #4 没有键名的索引数组

以上示例会输出:

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}

还可以只对某些单元指定键名而对其它的空置:

示例 #5 仅对部分单元指定键名

 "c",
"d",
);
var_dump($array);
?>

以上示例会输出:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

可以看到最后一个值“d”被赋予了键名 7。这是因为之前最大的整数键名为 6。

示例 #6 复杂类型转换和覆盖的例子

这个例子包括键名类型转换和元素覆盖的所有变化。

 'a',
值 "a" 会被 "b" 所覆盖;"a" 的值会被 "b" 给覆盖;"a" 将会被 "b" 覆盖掉;"a" 会被 "b" 替换掉其值;"a" 的值会被 "b" 取代;"a" 会被 "b" 覆盖原来的值;"a" 的原有值会被 "b" 覆盖;"a" 原本的值会被 "b" 覆盖掉;"a" 原来的值会被 "b" 所覆盖;"a" 原先的值会被 "b" 覆盖。
"5" 的值会被 "c" 覆盖,之前的值 "b" 会被新值替代
-1 => 'd',
因为这不是整数字符串,所以不会覆盖键名 1 。
因为这不是整数字符串,所以不会覆盖键名 1,同时有“1.5” => “f”这样的赋值操作。
true 意味着 'g',也就是说值 "c" 将会被 "g" 所替代。
false => 'h',
'' => 'i',
null 等于 'j',并且值 "i" 会被 "j" 所覆盖。
值为“k”的键名被分配为 2,原因是之前最大的整数键是 1。
2 => 'l', // 值 "k" 会被 "l" 覆盖
);
var_dump($array);
?>

以上示例会输出:

array(7) {
  [1]=>
  string(1) "g"
  [-1]=>
  string(1) "d"
  ["01"]=>
  string(1) "e"
  ["1.5"]=>
  string(1) "f"
  [0]=>
  string(1) "h"
  [""]=>
  string(1) "j"
  [2]=>
  string(1) "l"
}

用方括号语法访问数组单元

数组单元可以通过array[key]语法来访问。

示例 #7 访问数组单元

 "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
输出数组中名为“multi”的元素下名为“dimensional”的元素下名为“array”的元素的值。
?>

以上示例会输出:

string(3) "bar"
int(24)
string(3) "foo"

在 PHP 8.0.0 之前,方括号和花括号能够相互替换来访问数组单元,比如$array[42]与$array{42}在特定例子中的效果是一样的。而花括号语法在 PHP 7.4.0 时已被弃用,到 PHP 8.0.0 时则不再被支持。

示例 #8 数组解引用

访问一个未定义的数组键名就如同访问未定义变量一样,会引发 E_WARNING 级别错误信息(在 PHP 8.0.0 之前是 E_NOTICE 级别),结果为 null。同时,数组解引用非 string 的标量值会产生 null,在 PHP 7.4.0 之前,不会发出错误消息。从 PHP 7.4.0 起,会产生 E_NOTICE 这一问题;从 PHP 8.0.0 起,会产生 E_WARNING 这一问题。可以使用方括号的语法来进行新建或修改操作。

可以通过明示地设定其中的值来修改现有的array。

通过在方括号内指定键名来给 array 赋值从而实现这一操作。同时,还可以省略键名,若如此,需给变量名加上一对空的方括号([])。

$arr[key] = value;
$arr[] = value;
// key 可以是 int 或 string
// value 可以是任意类型的值

如果$arr 不存在,或者被设置为 null,或者被设置为 false,就会新建它,这是创建 array 的另一种方法。但不鼓励这样做,因为若$arr 已经包含值(比如来自请求变量的 string),此值会被保留,而[]实际上是字符串访问运算符。初始化变量的最佳方式是直接给其赋值。

从 PHP 7.1.0 开始,若对字符串应用空索引操作符,就会抛出致命错误。在这之前,字符串会被默默地转换为数组。从 PHP 8.1.0 起,弃用从 false 值创建新数组这一操作。不过,仍然允许从 null 或者未定义的变量中创建新数组。

修改某个值时,需通过其键名给该单元赋予一个新值。删除某键值对时,要对其调用 unset()函数。

 1, 12 => 2);
$arr[] 的值为 56;这和 $arr[13] 的值为 56 是一样的。
// 在脚本的这一点上
$arr["x"] = 42; // 添加一个新元素
// 键名使用 "x"
unset($arr[5]); // 从数组中删除元素
unset($arr); // 删除整个数组
?>

注意:若给出方括号但未指定键名,就取当前最大的 int 索引值,新键名是该值加 1(最小为 0);若当前还没有 int 索引,键名则为 0。需注意,这里所使用的最大整数键名目前无需存在于 array 中,只需在上次 array 重新生成索引后曾存在于 array 即可。以上示例最终会输出:Array([0] => 1[1] => 2[2] => 3[3] => 4[4] => 5)、Array()、Array([5] => 6)、Array([0] => 6[1] => 7)。数组解包。

在 PHP 7.1.0 及之后可以使用[ ]语言结构来解包数组,也可以使用 list()语言结构来解包数组。这些结构能够把数组解包成不同的变量。

数组解包可用于foreach在迭代多维数组时对其进行解包。

如果没有提供变量,那么数组元素将会被忽略。并且数组解包一直是从索引 0 开始的。

PHP 7.1.0 开始,能够解包关联数组。在数字索引数组中,这样做更容易选中正确的元素,因为能够明确指定索引。

 1, 'bar' => 2, 'baz' => 3];
// 将索引 'baz' 处的元素分配给变量 $three
在 $source_array 中,'baz' 对应的位置被赋予了 $three 。
echo $three; // 打印 3
$source_array = ['foo', 'bar', 'baz'];
// 将索引 2 处的元素分配给变量 $baz
[2 => $baz] = $source_array;
echo $baz; // 打印 "baz"
?>

数组解包可以方便的用于两个变量交换。

分配时不支持展开运算符(...)。需要注意的是,尝试访问未定义的数组键与访问任何未定义的变量情况相同,这两种情况都会发出 E_WARNING 级别的错误消息(在 PHP 8.0.0 之前是 E_NOTICE 级别),并且结果将是 null。实用函数。

有很多操作数组的函数,参见数组函数一节。

unset()函数能够删除 array 中的某个键。不过需要留意的是,数组不会被重建索引。倘若需要在删除后重建索引,那么可以使用 array_values()函数来重建 array 索引。// 现在 $b 是 array(0 => 'one', 1 => 'three')

foreach 控制结构是为 array 而专门设计的。它给予了一种简便的方式来对 array 进行遍历。

数组做什么和不做什么为什么$foo[bar]错了?

在使用字符串表示的数组索引时,应该始终加上引号。比如使用$foo['bar'],而不是$foo[bar]。然而,为什么要这样做呢?也许在旧的脚本中曾经见过如下这种语法:

这样的情况是错误的,然而它却能够正常运行。那么究竟为什么是错的呢?原因在于此代码里存在一个未定义的常量(bar),而非字符串('bar'-注意引号)。并且 PHP 有可能在之后定义这个常量,不幸的是你的代码中使用了同样的名字。它能运行的原因是,PHP 会自动把裸字符串(即没有引号的 string 且不对应任何已知符号的那种)转化为一个其值就是该裸 string 的 string。比如说,如果不存在被定义为 bar 的常量,那么 PHP 就会在 string 中用'bar'来替代并使用它。

警告:若将未定义的常量当作裸字符串的回退,就会触发 E_NOTICE 级别错误。自 PHP 7.2.0 起,这种做法已被废弃,且会触发 E_WARNING 级别错误。从 PHP 8.0.0 起,它被移除了,同时会触发 Error 异常。需注意,这并不意味着始终要给键名加上引号。不要给键名为常量或变量的加上引号,不然会导致 PHP 无法解析它们。检查 1:在 /path/to/script.html 的第 9 行,存在未定义索引 $i 的提示,情况为坏的;在该文件的第 11 行,同样存在未定义索引 $i 的提示,情况为好的,结果为 2。

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

44阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

47阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读