一、PHP数组是什么?
PHP的数组就像一个"百宝袋",可以装很多东西:
- 可以装数字:
[1, 2, 3] - 可以装文字:
["苹果", "香蕉", "橙子"] - 可以装不同类型的东西:
[1, "苹果", true] - 还可以给每个东西起个名字(键名):
["name" => "小明", "age" => 18]
二、PHP数组的神奇之处
看这个例子:
<?php
// 创建一个数组
$fruits = ["苹果", "香蕉", "橙子"];
// 像普通数组一样使用
echo $fruits[0]; // 输出:苹果
// 也可以添加带名字的元素
$fruits["favorite"] = "草莓";
// 还可以混合使用数字和名字
$fruits[100] = "西瓜";
// 输出整个数组
print_r($fruits);
?>
输出结果:
Array
(
[0] => 苹果
[1] => 香蕉
[2] => 橙子
[favorite] => 草莓
[100] => 西瓜
)
PHP数组的神奇之处:
- 可以同时包含数字索引和字符串键名
- 索引不需要连续(例子中从2直接跳到100)
- 可以随时添加、删除元素
三、PHP数组的底层实现(哈希表)
PHP数组的底层是用"哈希表"(Hash Table)实现的。你可以把哈希表想象成一个"超级衣柜":
- 衣柜有很多抽屉(哈希表的槽位)
- 每个抽屉有一个编号(哈希值)
- 每个抽屉可以放一件衣服(数组元素)
当你要存放或查找一件衣服时:
- 首先根据衣服的名字(键名)计算出一个编号(哈希值)
- 然后根据编号找到对应的抽屉
- 存放或取出衣服
这就是PHP数组可以快速查找元素的原因!
四、PHP数组的操作原理
1. 添加元素
<?php
$user = []; // 创建一个空数组(超级衣柜)
// 添加一个元素
$user["name"] = "小明"; // 把"小明"这件衣服放进衣柜
// 背后发生了什么?
// 1. 计算"name"的哈希值(假设结果是12345)
// 2. 根据哈希值12345找到对应的抽屉
// 3. 把"小明"放进这个抽屉
?>
2. 查找元素
<?php
// 查找刚才添加的元素
echo $user["name"]; // 从衣柜里拿出"小明"
// 背后发生了什么?
// 1. 计算"name"的哈希值(同样得到12345)
// 2. 根据哈希值12345找到对应的抽屉
// 3. 从抽屉里取出"小明"
?>
3. 哈希冲突
如果两个不同的键名计算出了相同的哈希值怎么办?(比如"name"和"age"都算出了12345)
PHP使用"链地址法"解决冲突:
<?php
// 假设发生了哈希冲突
$user["name"] = "小明"; // 键名"name"的哈希值是12345
$user["age"] = 18; // 键名"age"的哈希值也是12345
// 背后发生了什么?
// 1. 计算"name"的哈希值12345,放入对应抽屉
// 2. 计算"age"的哈希值12345,发现抽屉已被占用
// 3. 把"age"挂在"name"后面(形成一个链表)
// 4. 查找时,如果发现抽屉里有多个元素,会逐个比较键名
?>
五、PHP数组的性能特点
-
随机访问很快(时间复杂度O(1)):
- 就像你知道衣服在哪个抽屉,直接去拿就行
-
添加元素很快(平均时间复杂度O(1)):
- 只要找到抽屉,直接放进去就行
-
遍历数组较慢(时间复杂度O(n)):
- 就像你要一件一件地检查衣柜里的所有衣服
六、PHP数组的使用场景
-
列表数据:
$fruits = ["苹果", "香蕉", "橙子"]; -
键值对数据:
$user = ["name" => "小明", "age" => 18, "city" => "北京"]; -
多维数据:
$users = [ ["name" => "小明", "age" => 18], ["name" => "小红", "age" => 20] ]; -
栈和队列:
$stack = []; array_push($stack, "a"); // 入栈 array_push($stack, "b"); // 入栈 $item = array_pop($stack); // 出栈(b)
七、PHP数组 vs 其他语言数组
| 特点 | PHP数组 | C语言数组 |
|---|---|---|
| 元素类型 | 可以混合(数字、字符串等) | 必须相同类型 |
| 索引方式 | 数字或字符串键名 | 只能是数字索引 |
| 内存效率 | 较低(需要维护哈希表) | 较高(连续内存块) |
| 使用灵活性 | 高(可以随意添加删除元素) | 低(大小固定) |
八、总结
PHP的数组之所以强大,是因为它底层使用哈希表实现:
- 可以同时使用数字和字符串作为索引
- 可以快速查找、添加元素
- 可以动态调整大小
这就像一个"超级衣柜",可以存放各种类型的衣服,而且能根据衣服名字快速找到它们!
744

被折叠的 条评论
为什么被折叠?



