Php 如何利用递归函数计算多维数组中的平均值

Php 如何利用递归函数计算多维数组中的平均值,php,arrays,recursion,Php,Arrays,Recursion,如何通过以下多维数组递归地循环,但仍然按标准计算平均值?这是我的初始数组,然后找到我的代码(循环通过每个不理想的级别),然后输出 我正在寻找一个函数,可以减少或改进这段代码,这样我就可以重新利用计算其他级别的平均值 Array ( [42715] => Array ( [1886] => Array ( [1252] => Array

如何通过以下多维数组递归地循环,但仍然按标准计算平均值?这是我的初始数组,然后找到我的代码(循环通过每个不理想的级别),然后输出

我正在寻找一个函数,可以减少或改进这段代码,这样我就可以重新利用计算其他级别的平均值

Array
(
    [42715] => Array
        (
            [1886] => Array
                (
                    [1252] => Array
                        (
                            [1016] => Array
                                (
                                    [Standard 1] => Array
                                        (
                                            [0] => 1.0000000
                                            [1] => 0.5000000
                                            [2] => 1.0000000
                                            [3] => 1.0000000
                                            [4] => 1.0000000
                                            [5] => 1.0000000
                                        )

                                    [1] => 10/24/2017
                                    [Standard 2] => Array
                                        (
                                            [0] => 1.0000000
                                            [1] => 1.0000000
                                            [2] => 1.0000000
                                        )

                                    [Standard 3] => Array
                                        (
                                            [0] => 0.0000000
                                            [1] => 0.0000000
                                            [2] => 0.0000000
                                        )

                                    [Standard 4] => Array
                                        (
                                            [0] => 1.0000000
                                            [1] => 1.0000000
                                            [2] => 1.0000000
                                        )

                                    [Standard 5] => Array
                                        (
                                            [0] => 1.0000000
                                            [1] => 1.0000000
                                            [2] => 0.0000000
                                        )

                                    [Standard 6] => Array
                                        (
                                            [0] => 0.0000000
                                            [1] => 1.0000000
                                            [2] => 1.0000000
                                            [3] => 0.0000000
                                            [4] => 1.0000000
                                            [5] => 1.0000000
                                        )

                                    [Standard 7] => Array
                                        (
                                            [0] => 1.0000000
                                            [1] => 1.0000000
                                            [2] => 1.0000000
                                        )

                                    [Standard 8] => Array
                                        (
                                            [0] => 0.0000000
                                            [1] => 1.0000000
                                            [2] => 0.0000000
                                        )

                                    [Standard 9] => Array
                                        (
                                            [0] => 0.0000000
                                            [1] => 0.0000000
                                            [2] => 0.0000000
                                        )

                                )

                            [1019] => Array
                                (
                                    [Standard 8] => Array
                                        (
                                            [0] => 1.0000000
                                            [1] => 0.0000000
                                            [2] => 0.0000000
                                            [3] => 1.0000000
                                            [4] => 0.0000000
                                            [5] => 0.0000000
                                            [6] => 0.0000000
                                        )

                                    [1] => 10/24/2017
                                )

                            [1017] => Array
                                (
                                    [Standard 1] => Array
                                        (
                                            [0] => 0.0000000
                                        )

                                    [1] => 10/24/2017
                                    [Standard 2] => Array
                                        (
                                            [0] => 1.0000000
                                            [1] => 0.0000000
                                        )

                                    [Standard 3] => Array
                                        (
                                            [0] => 0.0000000
                                            [1] => 0.0000000
                                        )

                                    [Standard 4] => Array
                                        (
                                            [0] => 1.0000000
                                        )

                                    [Standard 5] => Array
                                        (
                                            [0] => 0.0000000
                                        )

                                    [Standard 6] => Array
                                        (
                                            [0] => 0.0000000
                                        )

                                    [Standard 7] => Array
                                        (
                                            [0] => 1.0000000
                                        )

                                    [Standard 8] => Array
                                        (
                                            [0] => 0.0000000
                                        )

                                    [Standard 9] => Array
                                        (
                                            [0] => 1.0000000
                                        )

                                )

                        )

                )
我用下面的代码计算9个标准的平均值

$quizrow = array();
foreach ($modulet as $teacherid => $teacherlist) {
    foreach ($teacherlist as $classid => $classlist) {
        foreach ($classlist as $courseid => $quizlist) {
            foreach ($quizlist as $quizid => $stdlist) {

                $count = $total = 0;
                $timemodified   = $stdlist['timemodified'];

                // Remove this element so we only have Standards.
                unset($stdlist['timemodified']);

                // Reorder the array so we get Standard 1, Standard 2, etc...
                ksort($stdlist, 2);
                foreach ($stdlist as $name => $std) {
                    $quizrow[$teacherid][$classid][$courseid][$quizid][0] = btr_get_quiz_name($quizid);
                    $quizrow[$teacherid][$classid][$courseid][$quizid][1] = $timemodified;
                    $quizrow[$teacherid][$classid][$courseid][$quizid][2] = "";

                    // Calculate the average of the Standards.
                    $average = round(array_sum($std) / count($std) * 100, 1) . "%";
                    $quizrow[$teacherid][$classid][$courseid][$quizid][$name] = $average;
                    $total += $average;
                    $count++;
                }

                // The second index will hold the average results for all Standards.
                $quizrow[$teacherid][$classid][$courseid][$quizid][2] = round($total / $count, 1) . "%";
            }
        }
    }
}
输出:

Array
(
    [42715] => Array
        (
            [1886] => Array
                (
                    [1252] => Array
                    (
                        [1016] => Array
                            (
                                [0] => Name
                                [1] => 10/24/2017
                                [2] => 62%
                                [Standard 1] => 91.7%
                                [Standard 2] => 100%
                                [Standard 3] => 0%
                                [Standard 4] => 100%
                                [Standard 5] => 66.7%
                                [Standard 6] => 66.7%
                                [Standard 7] => 100%
                                [Standard 8] => 33.3%
                                [Standard 9] => 0%
                            )

                        [1019] => Array
                            (
                                [0] => Name
                                [1] => 10/24/2017
                                [2] => 58.7%
                                [Standard 8] => 28.6%
                            )

                        [1017] => Array
                            (
                                [0] => Name
                                [1] => 10/24/2017
                                [2] => 49.3%
                                [Standard 1] => 0%
                                [Standard 2] => 50%
                                [Standard 3] => 0%
                                [Standard 4] => 100%
                                [Standard 5] => 0%
                                [Standard 6] => 0%
                                [Standard 7] => 100%
                                [Standard 8] => 0%
                                [Standard 9] => 100%
                            )

                    )

            )
编辑更新:正在重新组织输出数组,以计算下一级别的平均值

Array
(
    [42715] => Array
        (
            [1886] => Array
                (
                    [1252] => Array
                        (
                            [0] => Array
                                (
                                    [0] => Name
                                    [1] => Name
                                    [2] => Name
                                )

                            [1] => Array
                                (
                                    [0] => 10/24/2017
                                    [1] => 10/24/2017
                                    [2] => 10/24/2017
                                )

                            [2] => Array
                                (
                                    [0] => 62%
                                    [1] => 58.7%
                                    [2] => 49.3%
                                )

                            [Standard 1] => Array
                                (
                                    [0] => 91.7%
                                    [1] => 0%
                                )

                            [Standard 2] => Array
                                (
                                    [0] => 100%
                                    [1] => 50%
                                )

                            [Standard 3] => Array
                                (
                                    [0] => 0%
                                    [1] => 0%
                                )

                            [Standard 4] => Array
                                (
                                    [0] => 100%
                                    [1] => 100%
                                )

                            [Standard 5] => Array
                                (
                                    [0] => 66.7%
                                    [1] => 0%
                                )

                            [Standard 6] => Array
                                (
                                    [0] => 66.7%
                                    [1] => 0%
                                )

                            [Standard 7] => Array
                                (
                                    [0] => 100%
                                    [1] => 100%
                                )

                            [Standard 8] => Array
                                (
                                    [0] => 33.3%
                                    [1] => 28.6%
                                    [2] => 0%
                                )

                            [Standard 9] => Array
                                (
                                    [0] => 0%
                                    [1] => 100%
                                )

                        )

                )
我再次使用foreach循环到最深层,代码非常相似,获得平均输出:

Array
(
    [42715] => Array
        (
            [1886] => Array
                (
                    [1252] => Array
                        (
                            [0] => Unit of Study: The Price of Fashion – 830L
                            [1] => 10/24/2017
                            [2] => 50.9%
                            [Standard 1] => 45.9%
                            [Standard 2] => 75%
                            [Standard 3] => 0%
                            [Standard 4] => 100%
                            [Standard 5] => 33.4%
                            [Standard 6] => 33.4%
                            [Standard 7] => 100%
                            [Standard 8] => 20.6%
                            [Standard 9] => 50%
                        )

                )

我必须这样做直到最新级别。

如果您只需要整个数组的值,而不关心索引,则可以这样做:

 <?php                                                                      
    $a = array(array(array(array(array(1,2,3,4,5,99)))));                      
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));       
    $s = array();                                                              
    foreach($it as $v) {                                                       
      $s[] = $v;                                                               
    }                                                                          
    echo(array_sum($s)/count($s));                                             

[有关过程的解释,请参见内联注释]

代码:()

输出:

array (
  42715 => 
  array (
    1886 => 
    array (
      1295 => 
      array (
        1166 => 
        array (
          0 => 'Quiz Name',
          1 => '10/23/2017',
          2 => '45.5%',
          'Standard 1' => '54.5%',
          'Standard 2' => '36.4%',
        ),
      ),
    ),
  ),
)

@AndresRamos我想我的这个功能可以正常工作。请在一些真实阵列上运行此命令,如果有任何错误,请告诉我。如果有问题需要解决,请为我提供导致故障的新阵列。如果有什么需要进一步解释的话,请给我留言,我会尝试进一步解释。(顺便提一下,这是一个很好的问题,非常清楚——这是很少见的)它对初始数组很有效-这很好因为键
['timemodified']
。但随后我重新组织了输出,以计算其他级别的平均值,而新的数组在这一点上类似于递归函数无法按预期工作。我可以将初始数组更改为使用
[1]
而不是
['timemodified']
作为索引,但是我需要在函数中做什么更改?你真是太棒了!请为我提供一个新的输入数组,更好地代表您的真实数据结构。我会帮你修改我的密码。。。最适合我的是,如果你将新数组直接加载到我的演示链接脚本中(替换原始数组声明),然后保存它并将新链接作为注释发送给我。谢谢@mick,我编辑了我的原始帖子并添加了更多真实数据。另外,您可以在这里找到新的数组输入,我将它添加到了以前的数组下面。我可以为非标准索引修改初始数组的索引,也可以编辑其他索引,使其具有字符串索引,以便它们具有相同的结构。问题是第一个有一个字符串索引
['timemodified']
,其他的有
[0],[1][2]
作为非标准索引。当我在一个新数组中重新组织事物时,我会像
foreach($n=>$v的值){$courserr[$teacherid][$courseid][$index][$index]=$value;}
[0]
元素具有测验名称,因此在本例中,所有3个都属于该索引。这只是我的错,因为我不太擅长阵列。除了标准之外,唯一需要的索引是通常存储在索引[1]中的timemodified,您有什么建议?索引非常重要,不太清楚为什么我需要将数组设置得如此深,而不关心索引。
array (
  42715 => 
  array (
    1886 => 
    array (
      1295 => 
      array (
        1166 => 
        array (
          0 => 'Quiz Name',
          1 => '10/23/2017',
          2 => '45.5%',
          'Standard 1' => '54.5%',
          'Standard 2' => '36.4%',
        ),
      ),
    ),
  ),
)