我有一个这样的数组:
$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那样?
答案 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);
?>