首頁  >  文章  >  後端開發  >  如何使用 PHP 的 `array_diff_assoc()` 函數過濾二維陣列中的重疊行?

如何使用 PHP 的 `array_diff_assoc()` 函數過濾二維陣列中的重疊行?

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?

基於重疊行過濾二維數組的行

在PHP 中,array_diff_assoc() 函數通常用於確定之間的差異兩個數組。但是,在涉及 2D 陣列的某些場景中,使用者在嘗試過濾掉重疊行時可能會遇到意外結果。

使用者報告使用 array_diff_assoc() 比較兩個 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() 中的值的方式。僅當兩個值作為字串嚴格相等時才被視為相等。在提供的 2D 陣列的情況下,兩個陣列中與鍵「11」關聯的值是字串「common set」。但鍵值對本身與數組並不相同。

因此,當array_diff_assoc() 比較兩個陣列時,發現鍵值對[11 =>; 'common set'] 對於兩個陣列來說是相同的,因此將其排除在差異之外。這種行為源自於 PHP 中的所有陣列在內部都表示為字串「Array」這一事實。

要解決此問題,可以使用不同的方法來過濾掉 2D 數組之間的重疊行。一種常見的方法涉及為每一行建立唯一標識符,並使用該標識符作為關聯數組的鍵。以下是一個範例:

$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)));
}

此方法透過連接陣列值並將其用作鍵來為每行建立一個唯一識別碼。然後,它迭代第二個數組並從列表中取消設定任何匹配的唯一標識符。最後,它迭代剩餘的唯一標識符,翻轉鍵和值以重建行,並將它們添加到 $filteredRows 數組中。

透過利用此方法,您可以有效地過濾掉 2D 陣列之間的重疊行同時確保唯一的行被正確識別並在結果中傳回。

以上是如何使用 PHP 的 `array_diff_assoc()` 函數過濾二維陣列中的重疊行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn