阵列与关联数组唯一 - 删除重复项

时间:2011-02-02 08:51:01

标签: php duplicates associative-array

我有一个带有一些重复项的关联数组。例如,我有:

 <? 
 $group_array = array('user_id'=>array(), 'user_first'=>array());

输出如下内容:

Array
 (
[user_id] => Array
    (
        [0] => 594
        [1] => 597
        [2] => 594
    )

[user_first] => Array
    (
        [0] => John
        [1] => James
        [2] => John
    )
)

我想清理整个数组,以便只有用户John会出现一次(基于user_id)。

我尝试了以下内容:

 <?php 
   $unique = array_unique($group_array);
   print_r($unique);

但它似乎不起作用。如何删除数组中的重复项?

任何帮助都会很棒!

4 个答案:

答案 0 :(得分:3)

另一种方法是找到唯一的user_id,重要的是它们的数组键,然后只保留每列的相应值。

$group_array = array(
    'user_id'    => array(594,    597,     594,    598   ),
    'user_first' => array('John', 'James', 'John', 'John'),
);

// Find unique user_ids
$uniques = array_unique($group_array['user_id']);

// Keep only the uniques
foreach ($group_array as $column => $collection) {
    $group_array[$column] = array_intersect_key($collection, $uniques);
}

print_r($group_array);

答案 1 :(得分:1)

一些事情:

array_unique函数不会递归到子数组

阅读手册:http://php.net/manual/en/function.array-unique.php “当且仅当(字符串)$ elem1 ===(字符串)$ elem2时,两个元素被认为是相等的。在单词中:当字符串表示相同时。将使用第一个元素。”

在你的情况下,$ elem1和$ elem2都是数组

答案 2 :(得分:0)

此脚本删除user_id上的重复项并保留多个副本 firstnames如果他们的ID不同:

$group_array = Array(
    'user_id' => Array(
        594,
        597,
        594,
        598,
    ),
    'user_first' => Array(
        'John',
        'James',
        'John',
        'John',
    )
);

$dup = array();
for ($i=0; $i<count($group_array['user_id']); $i++) {
    if (in_array($group_array['user_id'][$i], $dup)) {
        unset($group_array['user_id'][$i]);
        unset($group_array['user_first'][$i]);
    } else {
        $dup[] = $group_array['user_id'][$i];
    }
}
print_r($group_array);

<强>输出:

Array
(
    [user_id] => Array
        (
            [0] => 594
            [1] => 597
            [3] => 598
        )

    [user_first] => Array
        (
            [0] => John
            [1] => James
            [3] => John
        )

)

答案 3 :(得分:0)

可能的解决方案是使用array_combine(...)

的过滤副作用
$array = [
    'user_id' => [
        0 => 594,
        1 => 597,
        2 => 594
    ],
    'user_first' => [
        0 => 'John',
        1 => 'James',
        2 => 'John'
    ]
];

$combinedArray = array_combine($array['user_id'], $array['user_first']);

所以我们得到了数组

Array
(
    [594] => John
    [597] => James
)

要恢复原始结构,我们只需提取键和值:

$array = [
    'user_id' => array_keys($combinedArray),
    'user_first' => array_values($combinedArray),
];

结果:

Array
(
    [user_id] => Array
        (
            [0] => 594
            [1] => 597
        )

    [user_first] => Array
        (
            [0] => John
            [1] => James
        )
)