删除数组中的元素,重复一个值

时间:2011-09-03 18:22:30

标签: php arrays

我有一个这样的数组:

$elements = array(
    array("name" => "Paco", "group" => 2),
    array("name" => "Juan", "group" => 3),
    array("name" => "Marta", "group" => 2),
    array("name" => "Julia", "group" => 4),
    array("name" => "Silvia", "group" => 2)
);

我需要避免重复这个群体。如果有多个元素具有相同的组,则最终数组必须只包含每个组中的第一个:

$elements = array(
    array("name" => "Paco", "group" => 2),
    array("name" => "Juan", "group" => 3),
    array("name" => "Julia", "group" => 4)
);

有没有比预告数组和处理每一行更好的方法?像SQL中的GROUP BY那样?

4 个答案:

答案 0 :(得分:4)

看到许多奇怪的代码出现了,有些是非常低效的或者在我看来很奇怪:

$values = array(); 

foreach($elements as $element) { 
    if (!isset($values[$element['group']])) {
        $values[$element['group']] = $element; 
    }
} 

现在你应该拥有的是一个数组,其中只保存了一个组的第一次出现,只需要一次传递O(N)。如果您不希望索引成为组ID,那么只需执行:

$values2 = array_values($values);

PS。如果你真的不喜欢array_values(),那么你也可以这样做(或者这个的一些变体):

$values = array();
$groupkeys = array();

foreach($elements as $element) { 
    if (!isset($groupkeys[$element['group']])) {
         $values[] = $element;
         $groupkeys[$element['group']] = TRUE;
    } 
}

答案 1 :(得分:1)

替代解决方案:

$groups = array_map(function($x) { return $x['group']; }, array_reverse($elements));
array_values(array_combine($groups, array_reverse($elements)));

答案 2 :(得分:-1)

您必须遍历整个数组并手动删除重复项:

$found = array();
foreach ($elements as $key => $element) {
    if (in_array($element['group'], $found, true)) {
        unset($elements[$key]);
    }

    $found[] = $element['group'];
}

实际上array_unique() function也是如此,但在C级别上。

答案 3 :(得分:-1)

试试这个,由php.net/array_unique上的评论提供,它创建一个新数组,其中键是序列化数组的散列,应该防止多维数组中的欺骗。

<?php
$values = array();

foreach($elements as $element) {
    $values[md5(serialize($element))] = $element;
}

sort($values);
?>