0

我只想检查重复的值 [id],并删除此“字段”[id] 重复的所有键。

示例:如果我有数字 1,2,1。我希望结果是 2,而不是 1,2。重复的标准仅通过检查 [id] 而不是任何其他“字段”来确定。

原始数组:

Array
(
    [0] => Array
        (
            [name] => John
            [id] => 123
            [color] => red
        )

    [1] => Array
        (
            [name] => Paul
            [id] => 958
            [color] => red
        )

    [2] => Array
        (
            [name] => Jennifer
            [id] => 123
            [color] => yellow
        )
)

我想要的结果:

Array
(
    [0] => Array
        (
            [name] => Paul
            [id] => 958
            [color] => red
        )

)
4

4 回答 4

2

我同意上述所有人的观点,您应该向我们提供有关您尝试过的更多信息,但我喜欢编写高尔夫代码,所以这是一个完全不可读的解决方案:

$new_array = array_filter($array, function($item) use (&$array){
    return count(array_filter($array, function($node) use (&$item){
        return $node['id'] == $item['id'];
    })) < 2;
});
于 2012-10-19T20:20:54.050 回答
1

这应该很容易通过几个简单的循环来完成:

set_time_limit(0); // Disable time limit to allow enough time to process a large dataset

// $items contains your data

$id_counts = array();
foreach ($items as $item) {
    if (array_key_exists($item['id'], $id_counts)) {
        $id_counts[$item['id']]++;
    } else {
        $id_counts[$item['id']] = 1;
    }
}

for ($i = count($items); $i >= 0; $i--) {
    if ($id_counts[$items[$i]['id']] > 1) {
        array_splice($items, $i, 1);
    }
}

结果:

Array
(
    [0] => Array
        (
            [name] => Paul
            [id] => 958
            [color] => red
        )
)

虽然有更简洁的方法可以做到这一点,但这种方法的一个优点是您只需为 id 列表和重复 id 列表创建新数组,并且array_splice从原始数组中删除重复项,因此内存使用量保持在最低限度。

编辑:修复了一个错误,这意味着它有时会留下一个

于 2012-10-19T20:17:54.310 回答
0
function PickUniques(array $items){
    // Quick way out
    if(empty($items)) return array();
    $counters = array();
    // Count occurences
    foreach($items as $item){
        $item['id'] = intval($item['id']);
        if(!isset($counters[$item['id']])){
            $counters[$item['id']] = 0;
        }
        $counters[$item['id']]++;
    }
    // Pop multiples occurence ones
    foreach($counters as $id => $occurences){
        if($occurences > 1){
            unset($counters[$id]);
        }
    }
    // Keep only those that occur once (in $counters)
    $valids = array();
    foreach($items as $item){
        if(!isset($items[$item['id']])) continue;
        $valids[$item['id']] = $item;
    }
    return $valids;
}

试试这个:)

于 2012-10-19T20:14:37.793 回答
0

这是一个非常基本的答案方法,我相信有更好的答案,但是我可能会从我在纸上的方式开始。

我查看第一个索引,检查它的值。然后,如果值与我最初记录的值相同,我会检查所有其他索引,并记下它们的索引。一旦我浏览了列表,如果我有多个具有该特定值的索引,我将它们全部删除(从最高索引开始,以免在删除时影响其他索引)。

对所有其他索引执行此操作,直到到达列表末尾。

它很冗长,但会确保它删除所有具有重复项的值。并且只留下那些原本没有重复的。

于 2012-10-19T20:18:48.277 回答