在 PHP 的日常开发中,array_diff() 函数常被用于对数组进行差集操作。它可以帮助我们找出在一个数组中存在、但在其他数组中不存在的值。这在处理数据过滤、权限控制等场景中非常实用。
不过一个经常被忽略的问题是:array_diff() 返回结果时会保留原数组的键名吗? 还是说,它会自动重新索引数组?
先看一个简单的例子:
<?php
$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
$array2 = ["green", "yellow", "red"];
$result = array_diff($array1, $array2);
print_r($result);
?>
输出结果为:
Array
(
[b] => brown
[c] => blue
)
可以看到,array_diff() 返回的结果 保留了原数组 $array1 的键名。即便是字符串键,它也没有被重新索引。
如果你确实想重新索引结果数组,可以手动使用 array_values():
$reindexed = array_values(array_diff($array1, $array2));
print_r($reindexed);
输出:
Array
(
[0] => brown
[1] => blue
)
这种情况下,键名被重置为从 0 开始的连续数字索引。
假设用户提交了一组标签,而你希望移除其中已经存在于系统默认标签中的内容:
<?php
$userTags = [
10 => "php",
11 => "html",
12 => "custom"
];
$defaultTags = ["php", "html", "css", "javascript"];
$finalTags = array_diff($userTags, $defaultTags);
print_r($finalTags);
?>
输出结果:
Array
(
[12] => custom
)
这表明函数确实保留了用户原始数组的键名,这在数据库插入或更新操作中可能是很有价值的信息。
array_diff() 只比较 值,不考虑键名。
如果你希望基于键名进行比较,可以使用 array_diff_key()。
如果要同时比较键名和值,可以使用 array_diff_assoc()。