【发布时间】: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