当前位置: 首页> 最新文章列表> array_diff() 会保留原数组的键名吗?

array_diff() 会保留原数组的键名吗?

M66 2025-05-14

在 PHP 的日常开发中,array_diff() 函数常被用于对数组进行差集操作。它可以帮助我们找出在一个数组中存在、但在其他数组中不存在的值。这在处理数据过滤、权限控制等场景中非常实用。

不过一个经常被忽略的问题是: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() 对比一下

如果你确实想重新索引结果数组,可以手动使用 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()

五、扩展阅读