php实现 arraydiff
实现 array_diff 功能
PHP 内置的 array_diff 函数用于比较多个数组,返回第一个数组中存在但其他数组中不存在的元素。以下是几种实现方式:
自定义 array_diff 函数
function custom_array_diff(array $array1, array ...$arrays): array
{
$diff = [];
foreach ($array1 as $value) {
$found = false;
foreach ($arrays as $array) {
if (in_array($value, $array, true)) {
$found = true;
break;
}
}
if (!$found) {
$diff[] = $value;
}
}
return $diff;
}
使用 array_filter 实现
function array_diff_filter(array $array1, array $array2): array
{
return array_filter($array1, function($item) use ($array2) {
return !in_array($item, $array2, true);
});
}
性能优化版本
对于大型数组,以下实现可能更高效:
function optimized_array_diff(array $array1, array ...$arrays): array
{
$valuesToExclude = [];
foreach ($arrays as $array) {
$valuesToExclude += array_flip($array);
}
return array_filter($array1, function($item) use ($valuesToExclude) {
return !isset($valuesToExclude[$item]);
});
}
使用 array_reduce
function array_diff_reduce(array $array1, array ...$arrays): array
{
return array_reduce($arrays, function($carry, $array) {
return array_filter($carry, function($item) use ($array) {
return !in_array($item, $array, true);
});
}, $array1);
}
注意事项
- 严格比较模式(使用 === 比较)通常更安全,可以避免类型转换问题
- 对于关联数组,这些实现会保留键名
- 多维数组需要递归处理或特殊处理
- 性能考虑:对于大型数组,翻转数组并使用 isset 检查通常比 in_array 更快
测试示例
$array1 = [1, 2, 3, 4, 5];
$array2 = [2, 4];
$array3 = [3, 5];
print_r(custom_array_diff($array1, $array2, $array3)); // 输出 [1]
print_r(array_diff_filter($array1, $array2)); // 输出 [1, 3, 5]
print_r(optimized_array_diff($array1, $array2)); // 输出 [1, 3, 5]






