PHP数组是PHP开发中最常用的数据结构之一,也是技术面试中的必考内容,相关题目既会考察基础概念,也会结合实际场景考察应用能力,下面系统梳理相关考点和典型例题。

PHP数组基础相关面试题
问题1:PHP数组有哪些类型?
PHP数组分为索引数组和关联数组两种。索引数组的键是整型数字,默认从0开始自增;关联数组的键是字符串,开发者可以自定义键名。实际使用中两种类型可以混合存在,PHP会根据键的类型自动区分。
问题2:如何判断一个变量是否为数组?
可以使用is_array()函数判断,该函数接收待检测的变量,返回布尔值,若为数组则返回true,否则返回false。示例代码如下:
<?php $test1 = [1, 2, 3]; $test2 = "hello"; var_dump(is_array($test1)); // 输出 bool(true) var_dump(is_array($test2)); // 输出 bool(false) ?>
数组遍历相关面试题
问题1:PHP中遍历数组有哪些常用方式?
常用遍历方式包括for循环、foreach循环、while配合each或list、array_map等函数式遍历。其中foreach是最常用的方式,语法简洁且不需要关心数组的键类型,兼容性最好。
问题2:foreach遍历数组时修改元素需要注意什么?
如果需要在遍历时修改数组元素的值,需要在遍历变量前加引用符号&,否则修改的是副本不会影响原数组。遍历结束后建议销毁引用变量,避免后续使用出现逻辑错误。示例代码如下:
<?php
$arr = [1, 2, 3];
// 未使用引用,修改无效
foreach ($arr as $value) {
$value = $value * 2;
}
var_dump($arr); // 输出 [1,2,3]
// 使用引用,修改生效
foreach ($arr as &$value) {
$value = $value * 2;
}
var_dump($arr); // 输出 [2,4,6]
unset($value); // 销毁引用
?>
数组常用函数相关面试题
问题1:array_merge和数组相加+的区别是什么?
两者的核心区别体现在键名冲突时的处理逻辑:array_merge遇到相同字符串键名时,后面数组的值会覆盖前面数组的值;遇到相同数字键名时,后面的值会附加到结果数组末尾,键名会重新索引。而数组相加+遇到相同键名时,前面数组的值会保留,后面数组的对应键值会被忽略,无论是字符串键还是数字键都遵循这个规则。示例代码如下:
<?php $arr1 = ["a" => 1, "b" => 2, 0 => 3]; $arr2 = ["a" => 4, "c" => 5, 0 => 6]; $mergeResult = array_merge($arr1, $arr2); var_dump($mergeResult); // 输出 ["a"=>4,"b"=>2,0=>3,1=>6,"c"=>5],字符串键a被覆盖,数字键0重新索引 $plusResult = $arr1 + $arr2; var_dump($plusResult); // 输出 ["a"=>1,"b"=>2,0=>3,"c"=>5],相同键都保留arr1的值 ?>
问题2:如何实现数组去重?
可以使用array_unique()函数,该函数会返回去重后的新数组,原数组不会被修改。函数默认会保留第一个出现的元素,后面重复的元素会被移除。如果需要保留键名可以使用array_keys(array_flip($arr))的方式,先反转键值再取键名,效率更高但只适用于值都是字符串或整型的情况。示例代码如下:
<?php $arr = [1, 2, 2, 3, 3, 3]; $uniqueArr = array_unique($arr); var_dump($uniqueArr); // 输出 [1,2,3] // 键值反转去重 $fastUnique = array_keys(array_flip($arr)); var_dump($fastUnique); // 输出 [1,2,3] ?>
数组排序相关面试题
问题1:PHP数组排序函数有哪些,区别是什么?
常用排序函数分为几类:按值排序的有sort()(升序,重置键名)、rsort()(降序,重置键名)、asort()(升序,保留键名)、arsort()(降序,保留键名);按键排序的有ksort()(键升序,保留键名)、krsort()(键降序,保留键名);自然排序的是natsort(),会按照人类习惯的自然顺序排序,比如"img2"会排在"img10"前面。示例代码如下:
<?php $arr = ["img10" => 10, "img2" => 2, "img1" => 1]; natsort($arr); var_dump($arr); // 输出 ["img1"=>1,"img2"=>2,"img10"=>10] ?>
问题2:如何对多维数组按照指定字段排序?
可以使用usort()函数自定义比较逻辑,或者使用array_multisort()函数结合提取的字段数组排序。以usort为例,示例代码如下:
<?php
$users = [
["name" => "张三", "age" => 25],
["name" => "李四", "age" => 20],
["name" => "王五", "age" => 22]
];
// 按照age升序排序
usort($users, function($a, $b) {
return $a["age"] - $b["age"];
});
var_dump($users);
// 输出顺序为李四、王五、张三
?>
综合应用题
问题:有两个数组,找出两个数组的交集、差集和并集
PHP内置了对应的函数可以直接实现:array_intersect()求交集,array_diff()求差集(第一个数组有第二个没有),array_merge加array_unique可以实现并集。示例代码如下:
<?php $arr1 = [1, 2, 3, 4]; $arr2 = [3, 4, 5, 6]; // 交集 $intersect = array_intersect($arr1, $arr2); var_dump($intersect); // 输出 [3,4] // 差集 arr1有arr2没有 $diff = array_diff($arr1, $arr2); var_dump($diff); // 输出 [1,2] // 并集 $union = array_unique(array_merge($arr1, $arr2)); var_dump($union); // 输出 [1,2,3,4,5,6] ?>