首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP array_diff_uassoc() 自訂鍵名比較計算差集:同時檢查鍵與值

     編輯:PHP 相關知識

函式簽名

array_diff_uassoc(array $array, array ...$arrays): array
// 最後一個參數為 callable $key_compare_func
  • 同時比較**鍵名** (自訂回呼) 與**值** (鬆散 `==`)
  • 回傳**第一個陣列**中「鍵名或值不同」的元素
  • 保留原鍵名
  • PHP 5.1.6 有已知 bug,建議 PHP 5.3.3+ 或 PHP 7+ 使用

基本範例

<?php
function cmp($a, $b) {
    if ($a === $b) return 0;
    return $a > $b ? 1 : -1;
}

$a1 = [0 => 'Dog', 1 => 'Cat', 2 => 'Horse'];
$a2 = [3 => 'Dog', 1 => 'Cat', 5 => 'Horse'];

$result = array_diff_uassoc($a1, $a2, 'cmp');
print_r($result);
/*
Array
(
    [0] => Dog   // 鍵 0 vs 3 不同
    [2] => Horse // 鍵 2 vs 5 不同
)
// 索引 1 鍵名相同、值相同 → 排除
*/

進階:不分大小寫鍵名 + 值比較


$config1 = ['Host' => 'localhost', 'Port' => 3306, 'Debug' => true];
$config2 => ['host' => 'localhost', 'port' => 5432, 'debug' => true];

$cmp = fn($a, $b) => strcasecmp($a, $b);
$diff = array_diff_uassoc($config1, $config2, $cmp);
// ['Port' => 3306]  ← 鍵名不分大小寫相同,但值 3306 != 5432
// Host、Debug 鍵名值皆同 → 排除

版本相容性提醒


// 檢查版本並提供降級方案
if (version_compare(PHP_VERSION, '5.3.3', '<')) {
    // 手動實作:遍歷 $array1,用自訂比較檢查是否存在於 $array2
    function diff_uassoc_legacy(array $a1, array $a2, callable $cmp): array {
        $res = [];
        foreach ($a1 as $k1 => $v1) {
            $found = false;
            foreach ($a2 as $k2 => $v2) {
                if ($cmp($k1, $k2) === 0 && $v1 == $v2) {
                    $found = true; break;
                }
            }
            if (!$found) $res[$k1] = $v1;
        }
        return $res;
    }
}

替代方案:`array_udiff_uassoc` (自訂值比較)


// 當需要「值」也用自訂邏輯比較 (如物件 ID 相等即同)
$diff = array_udiff_uassoc($a1, $a2,
    fn($a, $b) => $a->id <=> $b->id,  // 值比較
    fn($a, $b) => $a <=> $b           // 鍵比較
);

原文摘自 zuodefeng 筆記

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved