从多维数组中删除重复的值

时间:2018-10-22 22:33:10

标签: php

在此功能中,我正在过滤数据库输出。我不知道如何仅获取唯一值。我的阵列:

[2] => Array (
    [name] => John
    [id] => D
    )
[4] => Array (
    [name] => Grace
    [id] => K
    )
[6] => Array (
    [name] => John
    [id] => U
    )

现在,我需要一个仅包含第一个“ John”和“ Grace”的新数组,因为它们是“唯一的”。 我尝试了什么?

array_unique($filtredrow, "name");

但是在执行该功能之后,我只接收名称,而且还必须获得唯一人员的ID。

谢谢您的帮助!

编辑 这就是我想要得到的:

[2] => Array (
        [name] => John
        [id] => D
        )
    [4] => Array (
        [name] => Grace
        [id] => K
        )

我尝试不保存数组中已经存在的元素的加载数据。

$rows=$mydb->get_resoults("SELECT DISTINCT name, id FROM DB", ARRAY_A);
foreach($rows as $key=>$row)
    {
        if($row[name]!=null && $row[id]!=null)
        {
            if($filtredrow[$key][name]!=$row[name])
            {
                $filtredrow[$key][name]=$row[name];
                $filtredrow[$key][id]=$row[id];
            }
        }
    }

但是它会保存所有值:/还会重复

1 个答案:

答案 0 :(得分:1)

我将其放在开头,因为如果可能的话,我宁愿在数据库中执行此类操作。您可以更改查询以获得与所需结果类似的结果。

SELECT name, MIN(id) FROM your_table GROUP BY name

如果由于其他原因需要使用PHP进行此操作,则有几种不同的方法。

所有这些都涉及使用名称作为键将行分配给结果数组。

如果要保留每个名称的第一个实例,则在迭代输入数组时,如果结果数组中存在与行名匹配的键,则不要添加它。这样,您就可以在结果集中找到此人姓名的第一个实例。

foreach ($your_array as $person) {
    if (!isset($unique[$person['name']]) {
        $unique[$person['name']] = $person;
    }
}
$unique = array_values($unique);

如果获取哪个ID无关紧要,则可以省去isset检查。这样,您将得到结果集中每个人名字的最后一个实例,因为每次遇到重复时,该键都会被覆盖。

foreach ($your_array as $person) {
    $unique[$person['name']] = $person;
}
$unique = array_values($unique);

如果需要保留所有与名称关联的ID,请将ID值附加到名称键下的数组中,而不要添加整行。

foreach ($your_array as $person) {
    $people[$person['name']][] = $person['id];
}

这将给您类似的结果

['John' => ['D', 'U'], 'Grace' => ['K']];