【问题标题】:Remove duplicated objects in array删除数组中的重复对象
【发布时间】:2021-08-10 13:37:48
【问题描述】:

我有一个包含几对对象的数组,如果一个对象在另一对对象中,我需要删除其他对。

顺序很重要,如果一个元素是单独的,我需要删除。将来我可以使用成对的 3

我正在尝试做的功能:

public function filterDedupped(array $couples): array
{
    $deduped = [];
    foreach ($couples as $couple) {
        // group without runs that are already in other groups
        $array = array_filter($couples, function ($run) use ($deduped) {
            return !$this->array_any($deduped, function ($g) use ($run) {
               return $this->array_any($g,function ($r) use ($run){
                   return $r === $run;
               });
            });
        });

        if (count($array) > 1) {
            $deduped[] = $array;
        };

    }

    return $deduped;

}

我的函数中的问题是最后一个比较是错误的,因为我将 $r 与 $run 进行比较,它是一个包含 2 次运行的数组。

我正在使用的 array_any 函数:

public function array_any(array $array, callable $fn): bool
{
    foreach ($array as $value) {
        if ($fn($value)) {
            return true;
        }
    }
    return false;
}

这是我的条目:

[
    [0] => Array
    (
        [0] => 4
        [1] => 5
    )

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

    [2] => Array
    (
        [0] => 5
        [1] => 3
    )
]

我想要的结果应该删除最后一个数组 [2],因为 id 为 5 的对象已被另一对使用。

【问题讨论】:

  • 迭代输入数组并将每个子数组添加到新数组中,第二个和每个下​​一个元素检查该 id 是否已被使用以及是否跳过添加该元素。
  • 但是这样做我会丢失我的数组结构,我必须保持我的条目的顺序和结构。或者我没有正确理解......
  • 不,如果你写得正确,你不会,只是你会得到具有相同结构和顺序的新数组,但没有不需要的值。

标签: php duplicates


【解决方案1】:

这个一分钟的工艺不符合回答的条件,但是没有其他选项可以显示示例代码。简单迭代到新数组中,以保持顺序和结构(扩展示例数据以获得更好的视图)。

<?php

$inputArr = [
    [4, 5],
    [1, 2],
    [5, 3],
    [2, 20],
    [19, 21],
    [9, 11],

];

$outputArr = [];

foreach ($inputArr as $subArr) {

    $valueAlreadyUsed = false;

    foreach ($subArr as $valueToCheck) {
        foreach ($outputArr as $outSubArr) {
            if (in_array($valueToCheck, $outSubArr)) {
                $valueAlreadyUsed = true;
            }
        }
    }

    if (!$valueAlreadyUsed) {
        $outputArr[] = $subArr;
    }
}

print_r($outputArr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 2012-11-24
    • 1970-01-01
    • 2017-09-01
    • 2021-07-01
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多