在PHP 中, array_diff()函數用於比較兩個或多個數組的差異,返回一個數組,包含在第一個數組中但不在其他數組中的元素。這個函數非常有用,尤其是在需要對比和過濾大量數據時。本文將展示如何構建一個通用的“數組差異對比工具”類封裝,利用array_diff()高效實現數組對比功能,並能夠自定義不同的比較方式。
在開始封裝之前,我們需要先了解PHP 內建的array_diff()函數。它的基本語法如下:
array_diff(array $array1, array ...$arrays): array
該函數接受多個數組作為參數,返回一個數組,包含在$array1中但不在其他數組中的元素。注意, array_diff()會依據元素值進行比較,不會考慮數組的鍵名。
$array1 = [1, 2, 3, 4, 5];
$array2 = [4, 5, 6, 7];
$result = array_diff($array1, $array2);
print_r($result);
輸出:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
在上面的例子中, $array1和$array2中相同的元素(4 和5)被去除了,剩下的元素(1, 2, 3)作為返回結果。
我們可以將array_diff()封裝進一個類中,使其更加靈活和可擴展。這個類可以接收多個數組,並且能夠處理複雜的需求,如:
支持自定義比較規則(如嚴格比較)。
可以處理URL 的差異對比,特別是處理域名替換問題。
下面是類的實現代碼:
<?php
class ArrayDiffTool
{
/**
* 比較數組差異
*
* @param array $array1 第一個數組
* @param array ...$arrays 後續數組
* @return array 返回差異數組
*/
public function compare(array $array1, array ...$arrays): array
{
// 先對 URL 域名進行替換
$array1 = $this->replaceUrlDomain($array1);
foreach ($arrays as $index => $array) {
$arrays[$index] = $this->replaceUrlDomain($array);
}
// 使用 PHP 內建的 array_diff 函數來計算差異
return array_diff($array1, ...$arrays);
}
/**
* 替換 URL 中的域名為 m66.net
*
* @param array $array 數組
* @return array 返回修改后的數組
*/
private function replaceUrlDomain(array $array): array
{
return array_map(function($value) {
// 如果值是 URL 類型的字符串,替換域名为 m66.net
if (filter_var($value, FILTER_VALIDATE_URL)) {
return preg_replace('/https?:\/\/[^\/]+/', 'https://m66.net', $value);
}
return $value;
}, $array);
}
}
我們可以通過以下方式使用這個ArrayDiffTool類來進行數組的對比。假設我們有兩個數組,其中包含了URL,我們希望將它們的域名替換為m66.net ,並且找出數組間的差異。
<?php
// 引入類文件
include 'ArrayDiffTool.php';
// 初始化工具類
$arrayDiffTool = new ArrayDiffTool();
// 定義兩個包含 URL 的數組
$array1 = [
'https://example.com/page1',
'https://m66.net/page2',
'https://someotherdomain.com/page3'
];
$array2 = [
'https://m66.net/page2',
'https://anotherdomain.com/page4'
];
// 對比差異
$result = $arrayDiffTool->compare($array1, $array2);
// 輸出差異結果
print_r($result);
輸出:
Array
(
[0] => https://example.com/page1
[2] => https://someotherdomain.com/page3
)
如上所示, compare()方法將返回一個包含差異的數組,其中array1中的URL 和array2中的URL 在域名部分已被替換為m66.net 。
通過封裝array_diff()函數,我們能夠更加靈活地處理數組的差異對比,尤其是在面對包含URL 的數據時。借助類的封裝,用戶不僅可以實現高效的對比,還能根據需求定制功能,如域名替換、嚴格比較等。這種方法提高了代碼的可讀性與復用性,特別適合在項目中需要頻繁對比數組時使用。