【问题标题】:Average result of multidimensional array in PHPPHP中多维数组的平均结果
【发布时间】:2016-09-02 11:28:17
【问题描述】:

这是所有阵列专家的问题。我有一个多维数组,其结果为数字(可以是 0,1 或 2),并且需要按父级分组的每个数组的平均值。

在下面的示例中,计算将是:

subentry1_sub1 = 2 + 2 = 4 (4/2=2)

subentry1_sub2 = 1 + 1 = 2 (2/2=1)

所以我尝试在 PHP 中存档的是以下结果:

subentry1_sub1 平均值 = 2

subentry1_sub2 平均值 = 1

...

我已经尝试过类似问题的一些解决方案。但是对于所有递归函数,我并没有设法将它按最后一个子名称聚合(例如 subentry1_sub1)。

有什么想法吗?

编辑:

subentry1_sub1 是 2 + 2,因为它在数组中出现了两次

[entry1] => [subentry1] => [subentry1_sub1] => 结果

[entry2] => [subentry1] => [subentry1_sub1] => 结果

Array
(
    [entry1] => Array
        (
            [subentry1] => Array
                (
                    [subentry1_sub1] => Array
                        (
                            [value] => abc
                            [result] => 2
                        )

                    [subentry1_sub2] => Array
                        (
                            [value] => abc
                            [result] => 1
                        )

                )

            [subentry2] => Array
                (
                    [subentry2_sub1] => Array
                        (
                            [value] => abc
                            [result] => 1
                        )

                    [subentry2_sub2] => Array
                        (
                            [value] => abc
                            [result] => 1
                        )

                )

        )

    [entry2] => Array
        (
            [subentry1] => Array
                (
                    [subentry1_sub1] => Array
                        (
                            [value] => abc
                            [result] => 2
                        )

                    [subentry1_sub2] => Array
                        (
                            [value] => abc
                            [result] => 1
                        )

                )

            [subentry2] => Array
                (
                    [subentry2_sub1] => Array
                        (
                            [value] => abc
                            [result] => 1
                        )

                    [subentry2_sub2] => Array
                        (
                            [value] => abc
                            [result] => 1
                        )

                )

        )        
)

【问题讨论】:

  • 为什么是subentry1_sub1 = 2 + 2
  • 因为数组中有两次:[entry1] => [subentry1] => [subentry1_sub1] => result [entry2] => [subentry1] => [subentry1_sub1] => result跨度>

标签: php arrays multidimensional-array


【解决方案1】:

试试这个代码。在此我创建了一个新的array$sum,它将添加具有相同键的相同子条目子项的结果值和另一个数组$count,它将计算每个键重复的次数

<?php   
    $data = array('entry1'=>array(
         'subentry1'=>
             array(
               'subentry1_sub1'=>array('value'=>'abc','result'=>2),
               'subentry1_sub2'=>array('value'=>'abc','result'=>1)
             ),
         'subentry2'=>
             array(
               'subentry2_sub1'=>array('value'=>'abc','result'=>1),
               'subentry2_sub2'=>array('value'=>'abc','result'=>1)
             )

          ),
     'entry2'=>array(
         'subentry1'=>
             array(
               'subentry1_sub1'=>array('value'=>'abc','result'=>2),
               'subentry1_sub2'=>array('value'=>'abc','result'=>1)
             ),
         'subentry2'=>
             array(
               'subentry2_sub1'=>array('value'=>'abc','result'=>1),
               'subentry2_sub2'=>array('value'=>'abc','result'=>1)
             )
          )
    );

$sum = array();
$repeat = array();

    foreach($data as $input){
        foreach($input as $array){
                foreach($array as $key=>$value){
                        if(array_key_exists($key,$sum)){
                        $repeat[$key] = $repeat[$key]+1;
                        $sum[$key] = $sum[$key] + $value['result'];
                        }else{
                        $repeat[$key] = 1;
                        $sum[$key] = $value['result'];                              
                }}}}                    
echo "<pre>";
print_r($sum);
print_r($repeat);  
foreach($sum as $key=>$value){
   echo $key. ' Average = '. $value/$repeat[$key]."</br>";  
    }

输出

Array
(
    [subentry1_sub1] => 4
    [subentry1_sub2] => 2
    [subentry2_sub1] => 2
    [subentry2_sub2] => 2
)
Array
(
    [subentry1_sub1] => 2
    [subentry1_sub2] => 2
    [subentry2_sub1] => 2
    [subentry2_sub2] => 2
)


subentry1_sub1 Average = 2
subentry1_sub2 Average = 1
subentry2_sub1 Average = 1
subentry2_sub2 Average = 1

您现在可以轻松计算平均值

注意:正如你提到的,你正在计算subentry1_sub1 等的出现,所以我也做了同样的事情,所以它也将count 密钥result 存在与否

【讨论】:

  • 谢谢你!这正是我搜索的内容!效果很好。
【解决方案2】:

我知道这是一个旧线程,但我很确定对于任何感兴趣的人来说,有一种更简单的方法:

如果你知道结果总是一个数字:

foreach($my_array as $entry_name => $entry_data)
{
   foreach($entry_data as $sub_name => $sub_data) 
   {
      $sub_results = array_column($sub_data, 'result');
      $averages[$entry_name][$sub_name] = array_sum($sub_results)/count($sub_results);
   }
} 

如果结果可能为 NULL 或空,这将检查它并在没有有效数据来计算平均值时返回“N/A”:

foreach($my_array as $entry_name => $entry_data)
{
   foreach($entry_data as $sub_name => $sub_data) 
   {
      $sub_results = array_filter(array_column($sub_data, 'result'));
      $averages[$entry_name][$sub_name] = (count($sub_results) > 0 ? array_sum($sub_results)/count($sub_results) : 'N/A');
   }
} 

这两种解决方案都会为您提供一个平均数组,该数组将输出每个条目的每个子条目的平均值。

【讨论】:

    【解决方案3】:

    试试这个,

    <?php
        $data=array('entry1'=>array(
             'subentry1'=>
                 array(
                   'subentry1_sub1'=>array('value'=>'abc','result'=>3),
                   'subentry1_sub2'=>array('value'=>'abc','result'=>3)
                 ),
             'subentry2'=>
                 array(
                   'subentry2_sub1'=>array('value'=>'abc','result'=>2),
                   'subentry2_sub2'=>array('value'=>'abc','result'=>8)
                 )
    
              ),
         'entry2'=>array(
             'subentry1'=>
                 array(
                   'subentry1_sub1'=>array('value'=>'abc','result'=>6),
                   'subentry1_sub2'=>array('value'=>'abc','result'=>6)
                 ),
             'subentry2'=>
                 array(
                   'subentry2_sub1'=>array('value'=>'abc','result'=>10),
                   'subentry2_sub2'=>array('value'=>'abc','result'=>12)
                 )
              )
        );
    
        foreach($data as $k=>$v){
            echo "----------------$k---------------------\n";
            if(is_array($v)){
                foreach($v as $a=>$b){
                    if(is_array($b)){
                        echo $a.' average = ';
                        $c=array_keys($b);// now get *_sub*
                        $v1=isset($b[$c[0]]['result']) ? $b[$c[0]]['result'] : '';
                        $v2=isset($b[$c[1]]['result']) ? $b[$c[1]]['result'] : '';
                        echo ($v1+$v2)/2;
                        echo "\n";
                    }                   
                }
            }
        }
    

    Online Demo

    【讨论】:

    • 感谢您的回答。上面的例子只是一个摘录。真实数据要大得多。所以硬编码键是行不通的。
    【解决方案4】:

    与此同时,我自己找到了一个简单的可行解决方案:

    foreach ($data as $level2) {
        foreach ($level2 as $level3) {
            foreach ($level3 as $keyp => $level4) {
                foreach ($level4 as $key => $value) {
                    if($key == 'result') $stats[$keyp] += $value;
                }
            }
        }
    }
    

    这样您就可以得到新数组$stats 中每个键的总数。

    但也请务必查看user1234 的解决方案。它工作得很好,并且已经包括了平均值的计算。 https://stackoverflow.com/a/39292593/2466703

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      相关资源
      最近更新 更多