在多维数组中计算相同的值

时间:2015-02-07 16:43:21

标签: php arrays

我需要在多维数组中计算相同的值并删除重复项

我的阵列现在

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

我将非常感谢你的帮助

4 个答案:

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