过滤对象数组以仅保留第一次出现的列值[重复]

问题描述 投票:0回答:6

我正在使用多维数组。如何按值删除重复项?

在下面的数组中,[0]、[2]和[5]具有相同的[ID]。

是否有一个函数可以根据特定值删除任何重复的数组?

在这种情况下,我想删除数组 [2] 和数组 [5],因为它们具有与数组 [0] 相同的 [ID]。

[
    (object) ['d' => '2010-10-18 03:30:04', 'ID' => 9],
    (object) ['d' => '2010-10-18 03:30:20', 'ID' => 4],
    (object) ['d' => '2010-11-03 16:46:34', 'ID' => 9],
    (object) ['d' => '2010-11-02 03:19:14', 'ID' => 1],
    (object) ['d' => '2010-05-12 04:57:34', 'ID' => 2],
    (object) ['d' => '2010-05-10 05:24:15', 'ID' => 9],
];
php arrays multidimensional-array filter unique
6个回答
6
投票

一种方法:(

$old_array
是你的数组,
$new_array
将包含新数组,删除重复项,由该 ID 键入)

$new_array = array();
foreach ($old_array as $item)
  if (!array_key_exists($item->ID, $new_array))
    $new_array[$item->ID] = $item;

(我还没有测试过,但应该可以)


3
投票

你可以用茴香酒好东西来做到这一点

$result = FluentArray::from($array)->uniqueBy('ID')->toArray();

参见 http://ouzo.readthedocs.org/en/latest/utils/ Fluent_array.html#uniqueby


0
投票

我认为循环并构造一个新数组是最简单的。 在循环中,使用 array_key_exists() 判断新数组中是否已存在该 ID,如果不存在,则追加一个元素。


0
投票

不是一个多维数组,它是一个对象数组。您可以循环遍历它(此示例更改了数组):

$ids = array();

forach($array as $key=>$obj) {
    if(isset($ids[$obj->ID])) {//did we already encounter an object with this ID?
        unset($array[$key]); // if yes, delete this object
    }
    else {
        $ids[$obj->ID] = 1; // if not, add ID to processed IDs
    }
}

您还可以创建一个新数组并将对象添加到新数组中。


0
投票
foreach ($array as $element) {
    foreach ($array as &$element2) {
        if ($element2->ID == $element->ID && $element2 != $element) {
            unset($element2);
        }
    }
}

注意第二个 foreach 中的循环引用。


0
投票

Nspl 检查 indexed 函数。

use function \nspl\op\propertyGetter;
use function \nspl\a\indexed;

$groupedById = indexed($objects, propertyGetter('id'));
© www.soinside.com 2019 - 2024. All rights reserved.