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)));