array_diff(array $array, array ...$arrays): array
<?php
$arr1 = ['a' => 'red', 'b' => 'green', 'c' => 'blue', 'd' => 'yellow'];
$arr2 = ['e' => 'red', 'f' => 'purple', 'g' => 'blue'];
$result = array_diff($arr1, $arr2);
print_r($result);
/*
Array
(
[b] => green // 只在 arr1
[d] => yellow // 只在 arr1
)
// red、blue 存在於 arr2 被排除
*/
$all = ['a', 'b', 'c', 'd', 'e'];
$remove1 = ['b', 'c'];
$remove2 = ['d'];
$left = array_diff($all, $remove1, $remove2);
// ['a', 'e'] (鍵名保留: 0=>'a', 4=>'e')
$userPerms = ['read', 'write', 'delete', 'admin', 'config'];
$roleDeny = ['delete', 'admin']; // 角色禁止
$tempDeny = ['config']; // 臨時封鎖
$allowed = array_diff($userPerms, $roleDeny, $tempDeny);
// ['read', 'write']
$arr1 = [0 => '0', 1 => '1', 2 => '2'];
$arr2 = [0 => 0, 1 => 1]; // 整數
var_dump(array_diff($arr1, $arr2));
// [] ← '0' == 0 為 true,'1' == 1 為 true,全被排除!
// 解決: 改用 array_udiff 配合嚴格比較
$strict = array_udiff($arr1, $arr2, fn($a,$b) => $a === $b ? 0 : 1);
// ['0', '1', '2'] 保留字串
| 函式 | 比較依據 | 鍵名處理 |
|---|---|---|
| `array_diff` | 值 (鬆散) | 保留第一個陣列鍵名 |
| `array_diff_assoc` | 鍵+值 (鬆散) | 保留 |
| `array_diff_key` | 鍵名 | 保留 |
| `array_udiff` | 自訂回呼比較值 | 保留 |
| `array_udiff_assoc` | 自訂回呼比較鍵+值 | 保留 |
| `array_udiff_uassoc` | 自訂鍵比較 + 自訂值比較 | 保留 |
原文摘自 zuodefeng 筆記