PHP 数组常用操作:合并、拆分、查找与增删全解
PHP 数组是开发中最常用的数据结构之一。本文梳理了从基础的合并、拼接,到复杂的切片、替换,再到交集差集运算等核心函数。同时包含数组遍历指针操作及模拟栈和队列的增删技巧,帮助开发者高效处理各类数组场景。
1. 数组合并与连接
在处理数组时,经常需要将多个数组合并为一个,或者将两组数据建立对应关系。
第1步:合并数组 array_merge()
目的:将多个数组合并为一个联合数组,返回新结果。
- 入口与规则:数字键名的值不会覆盖,而是追加;字符串键名后面的值会覆盖前面的值。
- 示例:
<?php
$fruits = array("apple", "banana", "pear");
$numbered = array("1", "2", "3");
// 数字索引自动重新编号追加
$cards = array_merge($fruits, $numbered);
print_r($cards);
// 输出: Array ( [0] => apple [1] => banana [2] => pear [3] => 1 [4] => 2 [5] => 3 )
?>
第2步:递归合并 array_merge_recursive()
目的:当出现相同键名时,不直接覆盖,而是将两个值放入一个新的子数组中。
- 重要参数:输入多个数组。
- 完成状态:相同键对应的值变为嵌套数组。
<?php
$fruit1 = array("apple" => "red", "banana" => "yellow");
$fruit2 = array("pear" => "yellow", "apple" => "green");
$result = array_merge_recursive($fruit1, $fruit2);
// 'apple' 的值变成了数组 ['red', 'green']
?>
第3步:连接键与值 array_combine()
目的:使用一个数组的值作为键,另一个数组的值作为值,生成新数组。
- 注意:两个输入数组的大小必须相同且不为空。
<?php
$name = array("apple", "banana", "orange");
$color = array("red", "yellow", "orange");
$fruit = array_combine($name, $color);
?>
2. 数组截取与接合(切片与替换)
这两个函数常被混淆:array_slice 只取部分不改变原数组,array_splice 则会删除原数组中的部分并可选择性插入新内容。
第4步:安全切片提取 array_slice()
目的:返回数组中的一部分,不修改原数组。
- 参数:
offset(起始位置),length(长度)。 - 负数逻辑:
offset为负表示距末尾的位置;length为负表示截取的终点距离末尾多少个元素。
<?php
$fruits = array("Apple", "Banana", "Orange", "Pear", "Grape", "Lemon", "Watermelon");
// 从索引 2 开始,截取到倒数第 2 个元素之前
$subset = array_slice($fruits, 2, -2);
// 输出: Orange, Pear, Grape
?>
第5步:接合(删除并可选替换)array_splice()
目的:从原数组中删除指定范围的元素,并返回被删除的元素组成的数组。还可以用第四个参数替换被删除的部分。
- 风险提醒:
array_splice会永久修改原始数组的数据结构和索引。 - 参数:
array,offset,length, 可选replacement数组。
<?php
$fruits = array("Apple", "Banana", "Orange", "Pear", "Grape", "Lemon", "Watermelon");
// 删除索引 2 开始到倒数第 1 个之前的元素,并插入新水果
$subset = array_splice($fruits, 2, -1, array("Green Apple", "Red Apple"));
// $fruits 现在包含新的插入项,$subset 包含被移出的旧项
?>
3. 交集与差集运算
用于对比不同数组间的数据重合度。
第6步:基础交集 array_intersect()
目的:返回在第一个数组中出现,且在所有其他数组中也出现的值。保持第一个数组的键名。
- 完成判断:只有值和类型完全一致才算相同。
<?php
// 仅返回值相等的交集
$intersection = array_intersect($fruit1, $fruit2); // ['Apple']
?>
第7步:带键名交集 array_intersect_assoc()
目的:除了比较值,还严格比较键名。只有键名和值都匹配的键值对才会保留。
<?php
// red => Apple 同时存在于三个数组中
$result = array_intersect_assoc($fruit1, $fruit2, $fruit3);
?>
第8步:差集运算 array_diff() 与 array_diff_assoc()
目的:返回只出现在第一个数组中,而不出现在后续数组中的元素。
array_diff:仅比值。array_diff_assoc:比键和值。
<?php
// 找出只在 $fruit1 中存在的项
$res = array_diff($fruit1, $fruit2, $fruit3);
?>
4. 数组指针与遍历辅助
早期 PHP 版本常用这些函数配合 while 循环进行遍历,虽然现代开发更推荐 foreach,但了解其机制仍有助于理解底层逻辑。
第9步:定位当前元素
key():获取当前指针位置的键。current():获取当前指针位置的值。next():将指针向前移动一位(仅负责移动,不返回值)。
第10步:一次性获取键值对 each()
目的:返回当前指针所在的键/值对,并将指针推进一步。
- 注意:
each()在某些高版本 PHP 中已被废弃或建议避免使用,但在老代码库中常见。通常与list()结合使用。
<?php
reset($fruits); // 重置指针到开头
while (list($key, $val) = each($fruits)) {
echo "$key => $val<br />";
}
?>
5. 查找与筛选
第11步:值存在性检查 in_array()
目的:在数组中搜索特定值,找到返回 true,否则 false。
- 参数:第三个布尔参数
strict若为true,则同时检查数据类型。
第12步:键名存在性检查 array_key_exists()
目的:检查数组中是否存在指定的键名。
<?php
if(array_key_exists("apple", $fruit)){
printf("apple's color is %s", $fruit["apple"]);
}
?>
第13步:搜索获取键名 array_search()
目的:在数组中搜索给定的值,如果成功返回相应的键名,否则返回 false。
第14步:提取所有键或值
array_keys():返回包含所有键名的新数组。可传入第二个参数只返回匹配指定值的键。array_values():返回包含所有值的新数组,并重新索引数值键。
6. 模拟栈与队列的增删(头尾操作)
利用数组的特性实现简单的 FIFO(先进先出)或 LIFO(后进先出)逻辑。
第15步:头部与尾部压入(添加)
array_unshift($arr, $val):从头部添加元素。数值键会重排,关联键不变。返回新数组长度。array_push($arr, $val):从尾部添加元素。返回新数组长度。
第16步:头部与尾部弹出(删除)
array_shift($arr):删除并返回数组的第一个元素。其余元素前移并重新索引。array_pop($arr):删除并返回数组的最后一个元素。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









