【问题标题】:Multi Array Counting values of sub-arrays子数组的多数组计数值
【发布时间】:2014-11-06 14:19:28
【问题描述】:

我有多维数组:

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

我的意思是,键 [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 &lt; $cnt; $i++) 和条件 if ($array[$i]["id"] == $array[$i++]["id"]),因为它看起来很愚蠢,但我找不到其他任何东西。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    你的函数似乎太复杂了。这个怎么样?

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

    【讨论】:

    • 这正是我所需要的!感谢帮助。需要分析这个例子以备将来使用
    【解决方案2】:

    作为替代方案:这是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;
    }, []);
    

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

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多