簡體   English   中英

根據2個值從多維數組中刪除重復項

[英]Remove duplicates from a multi-dimensional array based on 2 values

我有一個看起來像這樣的數組

$array = array(
  array("John","Smith","1"),
  array("Bob","Barker","2"),
  array("Will","Smith","2"),
  array("Will","Smith","4")
);

最后,我希望數組看起來像這樣

$array = array(
  array("John","Smith","1"),
  array("Bob","Barker","2"),
  array("Will","Smith","2")
);

具有SORT_REGULAR標志的array_unique檢查所有三個值。 我已經看到了一些有關如何基於一個值刪除重復項的解決方案,但是我需要比較前兩個值的唯一性。

使用foreach循環和array_values函數的簡單解決方案:

$arr = array(
          array("John","Smith","1"), array("Bob","Barker","2"), 
          array("Will","Smith","2"), array("Will","Smith","4")
);

$result = [];
foreach ($arr as $v) {
    $k = $v[0] . $v[1];  // considering first 2 values as a unique key
    if (!isset($result[$k])) $result[$k] = $v;
}

$result = array_values($result);
print_r($result);

輸出:

Array
(
    [0] => Array
        (
            [0] => John
            [1] => Smith
            [2] => 1
        )

    [1] => Array
        (
            [0] => Bob
            [1] => Barker
            [2] => 2
        )

    [2] => Array
        (
            [0] => Will
            [1] => Smith
            [2] => 2
        )
)

帶有注釋的示例代碼:

// array to store already existing values
$existsing = array();
// new array
$filtered = array();

foreach ($array as $item) {
    // Unique key
    $key = $item[0] . ' ' . $item[1];

    // if key doesn't exists - add it and add item to $filtered
    if (!isset($existsing[$key])) {
        $existsing[$key] = 1;
        $filtered[] = $item;
    }
}

為了娛樂。 這將保留最后一次出現,並消除其他出現:

$array = array_combine(array_map(function($v) { return $v[0].$v[1]; }, $array), $array);
  • 映射數組,並從子數組的第一個條目開始構建鍵
  • 將返回的數組用作新數組中的鍵,將原始數組用作值

如果要保留第一次出現,則只需在數組前后顛倒數組即可:

$array = array_reverse($array);
$array = array_reverse(array_combine(array_map(function($v) { return $v[0].$v[1]; },
                                               $array), $array));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM