多数组计数子数组的值

时间:2014-11-06 14:19:29

标签: php arrays multidimensional-array

我有多维数组:

$array = array(
array(
"id" => 1,
"value" => 100
),
array(
"id" => 1,
"value" => 200
),
array(
"id" => 1,
"value" => 300
),
array(
"id" => 2,
"value" => 2
),
array(
"id" => 2,
"value" => 5
),
array(
"id" => 3,
"value" => 10.50
),
);

我需要获得新的多维数组,如下所示:

$newArray = array(
array(
"id" => "1",
"sum_of_values" => 600
),
array(
"id" => 2,
"sum_of_values" => 7
),
array(
"id" => 3,
"sum_of_values" => 10.50
),
);

我的意思是,key [sum_of_values]应该计算具有相同键[id]的子数组中的值。

我试过这个:

$cnt = count($array);

            $finalArray = array();
            $tempArray = array();
            for($i = 0; $i < $cnt; $i++){
                if($array[$i]["id"] == $array[$i++]["id"]){

                    $search = $array[$i]["id"];
                    $column = "value";

                    $sum = array_sum(
                                    array_map(
                                        function($data) use ($column) {
                                            return $data[$column];
                                        },
                                    array_filter(
                                        $array,
                                        function($data) use ($search) {
                                            return fnmatch($search, $data["id"]);
                                        }
                                    )
                                    )
                    );

                    $tempArray = array(
                        "id" => $array[$i]["id"],
                        "sum_of_values" => $sum
                        );

                    $finalArray[] = $tempArray;

                    } else {
                        $tempArray = array(
                            "id" => $array[$i]["id"],
                            "sum_of_values" => $array[$i]["value"]
                            );
                        }
            }

它有效,它计算具有相同[id]的子数组的值。但问题是没有返回子数组,其中[id]键没有相同的例子。在我的情况下 - [id] = 3的子数组将不会返回。此外,[id] = 1且[id] = 2的子数组将重复[n-n / 2]次。

我认为,问题在于使用周期 - for ($i = 0; $i < $cnt; $i++)和条件if ($array[$i]["id"] == $array[$i++]["id"]),因为它看起来很愚蠢,但我无法找到其他任何内容。

2 个答案:

答案 0 :(得分:3)

你的功能似乎太复杂了。怎么样?

$result = array();
foreach ($array as $item) {
    if (!empty($result[$item['id']]))
        $result[$item['id']]['sum_of_values'] += $item['value'];
    else
        $result[$item['id']] = array(
            'id' => $item['id'],
            'sum_of_values' => $item['value']
        );
}

如果你得到print_r($result)

 Array
(
    [1] => Array
        (
            [id] => 1
            [sum_of_values] => 600
        )

    [2] => Array
        (
            [id] => 2
            [sum_of_values] => 7
        )

    [3] => Array
        (
            [id] => 3
            [sum_of_values] => 10.5
        )

)

答案 1 :(得分:1)

作为替代方案:这是array_reduce()

的保姆
$totals = array_reduce($array, function($reduction, $current){
    $id = $current["id"];
    if (empty($reduction[$id])){
        $reduction[$id] = ["id"=>$id, "sum_of_values"=>0];
    }
    $reduction[$id]["sum_of_values"] += $current["value"];
    return $reduction;
}, []);

我更喜欢这种通用循环/处理的方法:我认为它更清洁一点。但是里程显然有所不同。