Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除重复一个值的数组中的元素_Php_Arrays - Fatal编程技术网

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

Php 删除重复一个值的数组中的元素,php,arrays,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" =>

我有这样一个数组:

$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?

您必须在整个阵列中循环并手动删除重复项:

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

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

事实上也是这样,但在C级别上。

试试这个,感谢php.net/array\u上的注释,它使一个新数组成为唯一的,其中键是序列化数组的哈希,应该可以防止多维数组中的重复

<?php
$values = array();

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

sort($values);
?> 

鉴于出现了许多奇怪的代码,我认为有些代码效率极低或很奇怪:

$values = array(); 

foreach($elements as $element) { 
    if (!isset($values[$element['group']])) {
        $values[$element['group']] = $element; 
    }
} 
现在应该有一个数组,其中只保存组的第一次出现,并且只需要一次传递O(N)。如果不希望索引是组id,则只需执行以下操作:

$values2 = array_values($values);
另外,如果你真的不喜欢array_values(),那么你也可以这样做(或者做一些变化):

替代解决方案:

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

是的,也许每两万年一次。当然要考虑一些事情。您也可以使用sha256之类的工具,否则只需按组对数组进行排序,然后再进行另一次传递,将每个组的第一个放入“最终数组”。避免了昂贵的元素序列化。。。如果不是的话,PHP中的数组是稀疏的,我相信,你可以只使用groupid作为键,只做一次传递。“我们应该忘记效率低的问题,比如说97%的时间:过早优化是万恶之源”-Knuth-1:这不是OP想要的(他希望每个组只有一行,而不是唯一的行).I thinsk您错过的数组\u unique不适用于多维数组$元素-是多维的,询问者希望在结果
unset($element)中有一个多维数组不会将其从列表中删除array@arnaud576875:你当然是对的。我已经修复了我的解决方案。这是非常低效的,in_数组是O(N)和O(N)循环,因此最终会得到类似O(N^2)的结果。也许我错了,但我认为我不能使用serialize&array_唯一的解决方案,因为子数组不重复(其中只有一个值重复),所以serialize即使重复“group”值也会生成不同的字符串。
$groups = array_map(function($x) { return $x['group']; }, array_reverse($elements));
array_values(array_combine($groups, array_reverse($elements)));