PHPでは、 array_diff()関数を使用して、2つ以上の配列間の違いを比較し、最初の配列に含まれるが他の配列には含まれていない配列を返します。この機能は、特に大量のデータを比較してフィルタリングする必要がある場合に非常に便利です。この記事では、一般的な「アレイ違いの比較ツール」クラスのカプセル化を構築し、 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に2つの配列があるとしたら、ドメインをM66.netに置き換えて、配列間の違いを確認したいとします。
<?php
// クラスファイルを紹介します
include 'ArrayDiffTool.php';
// 初期化ツールクラス
$arrayDiffTool = new ArrayDiffTool();
// 2つの包含物を定義します 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を含むデータに直面している場合、Arrayの違いをより柔軟に処理できます。クラスのカプセル化の助けを借りて、ユーザーは効率的な比較を達成するだけでなく、ドメイン名の交換、厳密な比較など、ニーズに応じて機能をカスタマイズすることもできます。この方法は、コードの読みやすさと再利用性を改善し、プロジェクトの配列を頻繁に比較する場合に特に適しています。