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%',
),
),
),
),
)