如何使用自定义条件从 PHP 中的多维数组中删除重复值


How to remove duplicate values from a multi-dimensional array in PHP with custom condition

这是一个与这个问题类似的问题,但略有不同,到目前为止我还没有找到答案。看看这个:

Array
(
    [0] => Array
    (
        ['id'] => abc
        ['value'] => XXX
    )
    [1] => Array
    (
        ['id'] => abc
        ['value'] => ooo
    )
    [2] => Array
    (
        ['id'] => abc
        ['value'] => qqq
    )
    [3] => Array
    (
        ['id'] => ghi
        ['value'] => YYY
    )
    [4] => Array
    (
        ['id'] => ghi
        ['value'] => jkl
    )
    [5] => Array
    (
        ['id'] => ghi
        ['value'] => XXX
    )
    [6] => Array
    (
        ['id'] => mno
        ['value'] => pql
    )
)

我想识别二维数组中的所有重复值,并使用自定义条件删除它们,例如在 uasort 中。

例如,取前 3 个元素 [0]、[1]、[2]:

我希望 XXX 胜过其他人,所以 [1] 和 [2] 将被删除,

与 [3]、[4] 和 [5] 相同:它们具有相同的 ID,但 YYY 胜过 XXX 和其他值。

由于这些是从 DBMS 检索的数据,因此我有一个替代方案是进行 N 个不同的查询,将下一个查询传递给要排除的 id,例如:">

  1. 使用 YYY 查找所有元素
  2. 使用 XXX 查找所有元素,但在查找 YYY 时尚未找到的元素
  3. 查找在
  4. 查找 YYY 或 XXX 时尚未找到的所有没有 YYY 和 XXX 的元素。

任何帮助将不胜感激,希望这一切都是可以理解的。

Linuxatico

如果不了解您的自定义条件有多复杂,就很难给出有效的解决方案。 如果您知道并且可以提前定义它们,那么您可以做一些简单的事情,例如:

// Your custom conditions
$master = array('abc' => array('XXX'), 'ghi' => array('YYY'));
// $dups = the array in your post
// Group by values
$values = array();
foreach ( $dups as $k => $v ) {
    if ( is_array($v) && isset($v['id']) ) {
        $values[$v['id']][$k] = $v['value'];
    }
}
// If master values exists, use it, otherwise use value given
$deduped = array();
foreach ( $values as $k => $v ) {
    if ( isset($master[$k]) ) {
        $deduped[key($v)] = array('id' => $k, 'value' => array_shift(array_intersect($master[$k], $v)));
    } else {
        $deduped[key($v)] = array('id' => $k, 'value' => array_shift($v));
    }
}

这给你...

Array
(
    [0] => Array
        (
            [id] => abc
            [value] => XXX
        )
    [3] => Array
        (
            [id] => ghi
            [value] => YYY
        )
    [6] => Array
        (
            [id] => mno
            [value] => pql
        )
)

在许多情况下,PHP 中的循环可能比 MySQL 快得多,因此您需要使用实际数据进行测试,以查看循环是否比单独的查询更快。