我需要在多维数组中计算相同的值并删除重复项
我的阵列现在
[0] => Array
(
[id] => 1
[title] => BMW
)
[1] => Array
(
[id] => 1
[title] => BMW
)
[2] => Array
(
[id] => 2
[title] => Mercedes
)
.......
需要输出
[0] => Array
(
[id] => 1
[title] => BMW
[count] => 2
)
[1] => Array
(
[id] => 2
[title] => Mercedes
[count] => 1
)
我将非常感谢你的帮助
答案 0 :(得分:4)
关键问题是数组(具有id和标题的数据)不可清除。
因此我们可以尝试哈希,只需将它们连接在一起,并将结果字符串作为哈希键。
因此,我们维护一个哈希表,该键是对象哈希键,值是结果数组索引。
然后,对于我们旅行的每个项目,我们可以在哈希表的帮助下找到结果数组位置,然后添加计数。
这是我的代码。
<?php
$array_in = array(
array('id'=>1, 'title'=>'BMW'),
array('id'=>1, 'title'=>'BMW'),
array('id'=>2, 'title'=>'Mercedes'),
);
$hash = array();
$array_out = array();
foreach($array_in as $item) {
$hash_key = $item['id'].'|'.$item['title'];
if(!array_key_exists($hash_key, $hash)) {
$hash[$hash_key] = sizeof($array_out);
array_push($array_out, array(
'id' => $item['id'],
'title' => $item['title'],
'count' => 0,
));
}
$array_out[$hash[$hash_key]]['count'] += 1;
}
var_dump($array_out);
答案 1 :(得分:2)
在这个示例中,我使用array_reduce从第一个数组中用适当的元素构建第二个数组。由于我检查重复值的方式,这假设您的初始数组已排序(所有dupes彼此相邻)。
function dedupe($carry, $item) {
// check if array is non empty, and the last item matches this item
if (count($carry) > 0
&& $carry[count($carry) - 1][0] == $item[0]
&& $carry[count($carry) - 1][1] == $item[1]) {
// the array contains a match, increment counter
$carry[count($carry) - 1][2]++;
} else {
// there was no match, add element to array
$carry[] = array($item[0], $item[1], 1);
}
return $carry;
}
$cars = array(
array(1, "BMW"),
array(1, "BMW"),
array(2, "Mercedes")
);
$uniques = array_reduce($cars, "dedupe", array());
var_dump($uniques);
答案 2 :(得分:2)
您可以迭代数组并按照此模式构造最终数组:
如果最终数组中存在元素id
的键,请更新其计数器。
如果没有,请创建一个以id
为键的新元素。
$orig = array(
array('id' => 1, 'title' => 'BMW'),
array('id' => 1, 'title' => 'BMW'),
array('id' => 2, 'title' => 'Mercedes'),
);
$result = array();
foreach ($orig as $element) {
(isset($result[$element["id"]])) ?
$result[$element["id"]]["count"] += 1 :
$result[$element["id"]] = array("id" => $element["id"], "title" => $element["title"], "count" => 1);
}
print_r($result);
答案 3 :(得分:2)
$cars = array(
array('id'=>1, 'title'=>'BMW'),
array('id'=>1, 'title'=>'BMW'),
array('id'=>2, 'title'=>'Mercedes'),
);
$serialize = array_map("serialize", $cars);
$count = array_count_values ($serialize);
$unique = array_unique($serialize);
foreach($unique as &$u)
{
$u_count = $count[$u];
$u = unserialize($u);
$u['count'] = $u_count;
}
print_r($unique);
否则,如果不需要计数,您只需按照example:
进行操作即可 $result = array_map("unserialize", array_unique(array_map("serialize", $array_in)))
;