ホームページ  >  記事  >  バックエンド開発  >  PHP の `array_diff_assoc()` 関数を使用して 2D 配列内の重複する行をフィルタリングする方法

PHP の `array_diff_assoc()` 関数を使用して 2D 配列内の重複する行をフィルタリングする方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 11:17:30113ブラウズ

How to Filter Overlapping Rows in 2D Arrays Using PHP's `array_diff_assoc()` Function?

重複する行に基づいて 2D 配列の行をフィルタリングする

PHP では、通常、array_diff_assoc() 関数を使用して、 2 つの配列。ただし、2D 配列を含む特定のシナリオでは、重複する行をフィルターで除外しようとすると、予期しない結果が発生する可能性があります。

あるユーザーは、array_diff_assoc() を使用して 2 つの 2D 配列を比較したが、その結果に両方の共通の行が含まれていることに気づいたと報告しました。一意の行だけではなく配列を使用します。問題を理解するために、ユーザーが提供したサンプル データを調べてみましょう。

$array1 = [
    [12 => 'new q sets'],
    [11 => 'common set']
];

$array2 => [
    [11 => 'common set']
];

array_diff_assoc($array1, $array2) を呼び出した後、ユーザーは $array1 からの一意の行のみを含む出力を受け取ることを期待していました。 (つまり、「[12 => '新しい q セット']」)。ただし、実際の出力は次のようになりました。

[
    [11 => 'common set']
]

問題は、PHP が array_diff_assoc() の値を比較する方法にあります。 2 つの値は、文字列として厳密に等しい場合にのみ等しいとみなされます。提供された 2D 配列の場合、両方の配列のキー '11' に関連付けられた値は文字列 'common set' です。ただし、キーと値のペア自体は配列として同一ではありません。

その結果、array_diff_assoc() が 2 つの配列を比較すると、キーと値のペア [11 =>] が一致することがわかります。 'common set'] は両方の配列に共通であり、相違点から除外されます。この動作は、PHP のすべての配列が内部的に文字列 "Array" として表されるという事実に起因しています。

この問題に対処するには、別のアプローチを利用して 2D 配列間で重複する行をフィルターで除外できます。一般的な方法の 1 つは、行ごとに一意の識別子を作成し、その識別子を連想配列のキーとして使用することです。以下に例を示します。

$uniqueIdentifiers = [];
$filteredRows = [];

foreach ($array1 as $row) {
    $uniqueIdentifier = implode('|', array_values($row));
    $uniqueIdentifiers[$uniqueIdentifier] = true;
}

foreach ($array2 as $row) {
    $uniqueIdentifier = implode('|', array_values($row));
    if (isset($uniqueIdentifiers[$uniqueIdentifier])) {
        unset($uniqueIdentifiers[$uniqueIdentifier]);
    }
}

foreach ($uniqueIdentifiers as $uniqueIdentifier => $isPresent) {
    $filteredRows[] = array_values(array_flip(explode('|', $uniqueIdentifier)));
}

このアプローチでは、配列値を連結し、それをキーとして使用することで、各行に一意の識別子を作成します。次に、2 番目の配列を反復処理し、リストから一致する一意の識別子の設定を解除します。最後に、残りの一意の識別子を反復処理し、キーと値を反転して行を再構築し、それらを $filteredRows 配列に追加します。

このメソッドを利用すると、2D 配列間で重複する行を効果的にフィルタリングできます。同時に、一意の行が正しく識別され、結果として返されることを保証します。

以上がPHP の `array_diff_assoc()` 関数を使用して 2D 配列内の重複する行をフィルタリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。