【问题标题】:Summarize the same key name in php multidimensional array总结php多维数组中相同的键名
【发布时间】:2017-12-28 09:50:59
【问题描述】:

我有一个这样的数组:

[0] => Array
            (
                [id_station] => 2397
                [hour] => 12
                [data] => Array
                    (
                        [cameraon] => 355654
                        [cameraoff] => 4532
                        [camerabroken] => 76745
                        ...
                    )
            )
[1] => Array
            (
                [id_station] => 2399
                [hour] => 13
                [data] => Array
                    (
                        [cameraon] => 3905466
                        [cameraoff] => 1672
                        [camerabroken] => 70780
                        ...
                    )
            )

我想再添加一行 = 所有项目的总和

[1] => Array
            (
                [id_station] => 
                [hour] => 
                [data] => Array
                    (
                        [cameraon] => 4261120
                        [cameraoff] => 6204
                        [camerabroken] => 147525
                    )
            )

我使用了array_sum(array_column($array["data], 'cameraon')),但我必须为所有项目做cameraoncameraoffcamerabroken(我有一百个项目)。

在这种情况下有什么方法可以得到总行数?

【问题讨论】:

  • 发布预期输出数组
  • 嗨,kunal,预期的数组是数据元素的所有子项的汇总数组,总 cameraon、cameraoff、camerabroken

标签: php arrays multidimensional-array summarize


【解决方案1】:

我假设你不知道data 子数组的深度。 (即有多少个键值对)

所以请像下面这样:-

$final_array = [];
$final_array['id_station'] ='';
$final_array['hour'] ='';
foreach($original_array as $original_arr){
  foreach($original_arr['data'] as $key=>$original){
     $final_array['data'][$key] +=$original;
  }
}

输出:-https://eval.in/926729

【讨论】:

  • 很酷,但是我们可以使用 1 个 foreach 而不是 2 个 foreach 的函数吗?
  • 恐怕你不行
  • @sontd 仍然面临问题?一件事->如果您知道data数组中的固定键数可以出现,那么只有您可以使用array_column()缩短代码
  • 不幸的是,数据数组中的键数不固定。无论如何,我可以使用临时解决方案。谢谢
【解决方案2】:

您希望对列数据求和,因此利用array_sum()array_column() 是明智的选择。剩下要做的就是设置循环。

您可以首先使用array_column() 隔离data 子数组,然后“向下钻取”到第一个子数组以迭代每一列。使用列名访问所有列中的所有值。无论您的 data 子数组的复杂性如何,这都会使该方法动态成功。

代码:(Demo)

$array=[
    [
        'id_station'=>2397,
        'hour'=>12,
        'data'=>['cameraon'=>355654,'cameraoff'=>4532,'camerabroken'=>76745]
    ],
    [
        'id_station'=>2399,
        'hour'=>14,
        'data'=>['cameraon'=>3905466,'cameraoff'=>1672,'camerabroken'=>70780]
    ]
];
$datas=array_column($array,'data');  // isolate the data subarrays
foreach(current($datas) as $column=>$data){  // iterate the columns
    $result[$column]=array_sum(array_column($datas,$column));  // sum the column values
}
$array[]=['id_station'=>'','hour'=>'','data'=>$result];  // completenew item and append
var_export($array);  // print to screen

输出:

array (
  0 => 
  array (
    'id_station' => 2397,
    'hour' => 12,
    'data' => 
    array (
      'cameraon' => 355654,
      'cameraoff' => 4532,
      'camerabroken' => 76745,
    ),
  ),
  1 => 
  array (
    'id_station' => 2399,
    'hour' => 14,
    'data' => 
    array (
      'cameraon' => 3905466,
      'cameraoff' => 1672,
      'camerabroken' => 70780,
    ),
  ),
  2 => 
  array (
    'id_station' => '',
    'hour' => '',
    'data' => 
    array (
      'cameraon' => 4261120,
      'cameraoff' => 6204,
      'camerabroken' => 147525,
    ),
  ),
)

【讨论】:

  • @sontd 您当前接受的答案不是专业级的,因为它会由于在未声明的数组元素上使用+= 而生成通知。证明:3v4l.org/MlUgb 这也是不正确的,你必须使用两个循环。我的方法展示了如何使用array_column() 是一种明智且有效的选择。我的方法在不产生通知的情况下运行得一样快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多