PHP语法基础篇(六):数组
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。本篇文章将记录数组的学习过程。
一、创建数组
二、访问数组
1、数组解包
2、遍历数组
三、操作数组
1、添加数组项
2、修改数组项
2.1、在 foreach 循环中修改数组项
3、删除数组项
四、多维数组
1、二维数组
五、数组函数
一、创建数组
可以用 array() 语言结构来新建一个 array。它接受任意数量用逗号分隔的 键(key) => 值(value) 对。
array(key => value,key2 => value2,key3 => value3,...
)
键(key)不是必需的,最后一个数组单元之后的逗号可以省略。
可以用短数组语法 [] 替代 array() 。
示例 一个简单的数组
$array = array("foo" => "bar","bar" => "foo",
);// 使用短数组语法
$array = ["foo" => "bar","bar" => "foo",
];
键(key)可以是 integer 或者 string。value 可以是任意类型。
此外 key 会有如下的强制转换:
- String 中包含有效的十进制 int,除非数字前面有一个 + 号,否则将被转换为 int 类型。例如键名 "8" 实际会被储存为 8。另外, "08" 不会被强制转换,因为它不是一个有效的十进制整数。
- Float 也会被转换为 int ,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
- Bool 也会被转换成 int。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
- Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
- Array 和 object 不能被用为键名。坚持这么做会导致警告:Illegal offset type。
如果在数组定义时多个元素都使用相同键名,那么只有最后一个会被使用。
示例 类型转换与覆盖
$array = array(1 => "a","1" => "b",1.5 => "c",true => "d",
);
var_dump($array);
输出
array (size=1)1 => string 'd' (length=1)
上述示例中所有的键名都被强制转换为 1,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 "d"。
PHP 数组可以同时含有 int 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。
PHP 数组可以同时含有 int 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。
索引数组:在索引数组中,每个项目都有一个索引号。默认情况下,第一个项目的索引是 0,第二个项目的索引是 1,依此类推。(Java中的数组就属于索引数组)
关联数组:是使用分配给它们的命名键的数组。(类似Java中的Map)
PHP 中的数组和其它编程语言中的数组并不完全一样,这一点需要注意。
示例 混合 int 和 string 键名的数组
$array = array("foo" => "bar","bar" => "foo",1 => -1,-1 => 1,
);
var_dump($array);
输出
array (size=4)'foo' => string 'bar' (length=3)'bar' => string 'foo' (length=3)1 => int -1-1 => int 1
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 int 键名加上 1 作为新的键名。
接下来看一个不使用键名的示例,此时创建的数组就是一个索引数组。
$array = array("a", "b", "c", "d");
var_dump($array);
输出
array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)2 => string 'c' (length=1)3 => string 'd' (length=1)
还可以对某些单元指定键名,而其它位置为空,没有键名。
$array = array("a","b",6 => "c","d",
);
var_dump($array);
输出
array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)6 => string 'c' (length=1)7 => string 'd' (length=1)
可以看到最后一个值 "d" 被自动赋予了键名 7。这是由于之前最大的整数键名是 6。
二、访问数组
数组单元可以通过 array[key](数组名[键名]) 来访问。
$arr = array("Hello, World","foo" => "bar","a",
);
var_dump($arr[0]);
var_dump($arr["foo"]);
var_dump($arr[1]);
输出
string 'Hello, World' (length=12)
string 'bar' (length=3)
string 'a' (length=1)
试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_WARNING 级别错误信息(在 PHP 8.0.0 之前是 E_NOTICE 级别),其结果为 null。
如果要获取数组中元素的个数,可以使用 count() 函数。count() 函数用于计算数组中元素的数量。
$arr1 = ["a", "b", "c"];
$arr2 = ["a" => 1, "b" => 1];echo count($arr1); // 输出 "3"
echo "<br>";
echo count($arr2); // 输出 "2"
1、数组解包
可以使用 [](自 PHP 7.1.0 起)语言结构解包数组。这些结构可用于将数组解包为不同的变量。
$source_array = ['a', 'b', 'c'];
[$a, $b, $c] = $source_array;echo $a . "<br>"; // 输出 "a"
echo $b . "<br>"; // 输出 "b"
echo $c . "<br>"; // 输出 "c"
如果变量未提供,数组元素将会被忽略。数组解包始终从索引 0 开始。
$source_array = ['a', 'b', 'c'];
// 将索引 2 的元素分配给变量 $c
[, , $c] = $source_array;echo $c; // 输出 "c"
自 PHP 7.1.0 起,也可以解包关联数组。这在数字索引数组中更容易选择正确的元素,因为可以显式指定索引。
$source_array = ['a' => 1, 'b' => 2, 'c' => 3];
// 将索引 'c' 处的元素分配给变量 $three
['c' => $three] = $source_array;
echo $three; // 输出 "3"echo "<br>";$source_array = ['a', 'b', 'c'];
// 将索引 2 处的元素分配给变量 $c
[2 => $c] = $source_array;
echo $c; // 输出 "c"
数组解包也可用于两个变量交换。
$a = 1;
$b = 2;[$b, $a] = [$a, $b];echo $a; // 输出 "2"
echo "<br>";
echo $b; // 输出 "1"
2、遍历数组
使用 foreach 对数组进行遍历。
语法
foreach (iterable_expression as $value) {// 代码段
}foreach (iterable_expression as $key => $value) {// 代码段
}
第一种格式遍历给定的 iterable_expression 迭代器。每次循环中,当前单元的值被赋给 $value。该遍历方式用于索引数组。
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。该遍历方式用于关联数组。
示例 foreach 遍历索引数组
$arr = ["a", "b", "c", "d"];
foreach($arr as $value) {echo $value . "<br>";
}
/* 输出abcd
*/
示例 foreach 遍历关联数组
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
foreach($arr as $key => $value) {echo $key . ":" . $value . "<br>";
}
/* 输出a:1b:2c:3
*/
三、操作数组
1、添加数组项
使用括号 [] 语法向现有数组中添加项(用于索引数组)。
$arr = ["a", "b", "c"];
$arr[] = ["d"];
var_dump($arr);
还可以使用 数组名[键名]=值 的方式向数组中添加项,如果键名在数组中已经存在,则会更改该键名对应的值。
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["d"] = 4;
var_dump($arr);
使用 array_push() 函数可以向现有数组中添加多个项(用于索引数组)。
$arr = ["a", "b", "c"];
array_push($arr, "d", "e", "f");
var_dump($arr);
要向关联数组中添加多个项,可以使用 += 运算符。
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr += ["d" => 4, "e" => 5];
var_dump($arr);
2、修改数组项
要修改现有的数组项,对于索引数组,可以引用索引号;对于关联数组,可以引用键名。
示例 更改索引数组指定项的值
// 将数组第二项,即索引为 1 的项的值改为 "B"
$arr = ["a", "b", "c"];
$arr[1] = "B";
var_dump($arr);
示例 更改关联数组指定键名的值
// 将键名 "b" 的值更改为 "二"
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["b"] = "二";
var_dump($arr);
2.1、在 foreach 循环中修改数组项
通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {$value = $value * 2;
}
// 现在 $arr 是 array[2, 4, 6, 8]
unset($value); // 最后取消掉引用
var_dump($arr);
注意:数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
3、删除数组项
使用 unset() 函数来删除现有的数组项。该函数接受无限数量的参数,因此可用于删除多个数组项。
$arr = ["a", "b", "c", "d", "e", "f"];
unset($arr[1]); // 删除1项
unset($arr[3], $arr[4]); // 删除多项
var_dump($arr);$phones = array("brand" => "Vivo", "price" => 1999, "color" => "red");
unset($phones["price"]); // 删除关联数组中指定键名项
var_dump($phones);
输出
array (size=3)0 => string 'a' (length=1)2 => string 'c' (length=1)5 => string 'f' (length=1)
array (size=2)'brand' => string 'Vivo' (length=4)'color' => string 'red' (length=3)
注意:unset() 函数不会重新排列索引,这意味着在删除后,数组将不再包含缺失的索引。
使用 array_pop() 函数删除数组的最后一项。
$arr = ["a", "b", "c", "d", "e", "f"];
array_pop($arr);
var_dump($arr);
使用 array_shift() 函数删除数组的第一项。
$arr = ["a", "b", "c", "d", "e", "f"];
array_shift($arr);
var_dump($arr);
四、多维数组
多维数组是一个包含一个或多个数组的数组,PHP 支持深度为二、三、四、五或更多层的多维数组。
数组的维度表示选择元素所需的索引数量。
- 对于二维数组,需要两个索引来选择元素
- 对于三维数组,需要三个索引来选择元素
本篇文章只对二维数组进行说明。
1、二维数组
二维数组是数组的数组,我们通常使用它来保存表格数据。
首先,来看下面的表格:
手机品牌 | 库存 | 价格 |
华为 | 200 | 1999 |
小米 | 350 | 1599 |
Vivo | 103 | 1799 |
我们可以将上表中的数据存储在二维数组中,如下所示:
$phones = [["华为", 200, 1999],["小米", 350, 1599],["Vivo", 103, 1799]
];
现在二维的 $phones 数组包含四个数组,并且它有两个索引:行和列(索引都是从 0 开始)。
要访问 $phones 数组的元素,我们必须指向两个索引(行和列):
echo $phones[0][0] . ":库存:" . $phones[0][1] . ",价格:" . $phones[0][2] . "<br>";
echo $phones[1][0] . ":库存:" . $phones[1][1] . ",价格:" . $phones[1][2] . "<br>";
echo $phones[2][0] . ":库存:" . $phones[2][1] . ",价格:" . $phones[2][2] . "<br>";
还可将数组解包用于 foreach 在迭代多维数组时对其进行解包。
foreach ($phones as [$brand, $inventory, $price]) {echo $brand . ":库存:" . $inventory . ",价格:" . $price . "<br>";
}
五、数组函数
PHP 提供了一组内置函数,可用于操作数组。该函数内容过多,就不在文章中一一进行记录了,这里记录下数组函数的文档地址,方便以后使用时查阅。文档地址:数组函数官方文档。