我不得不这样做在两个函数(只是因为搜索的递归性,但这里是我的出价:
function mdarray_avg($array, $level = ''){
if (!is_array($array)) throw new Exception("First argument must be an array");
if (!is_string($level)) throw new Exception("Second argument must be string");
$ary = $array;
$levels = explode('.',$level);
foreach ($levels as $lvl){
if (array_key_exists($lvl,$ary))
$ary = $ary[$lvl];
else
throw new Exception("Level {$level} doesn't exist");
}
$numbers = _mdarray_avg($ary);
$sum = array_sum($numbers);
return ($sum > 0 ? $sum/count($numbers) : 0);
}
function _mdarray_avg($array){
if (!is_array($array)) return array($array);
$numbers = array();
foreach ($array as $element){
if (is_array($element))
$numbers = array_merge($numbers,_mdarray_avg($element));
else
$numbers[] = $element;
}
return $numbers;
}
使用它,像这样:
echo "Average: ".mdarray_avg($t,'4'); // returns 11, as expected.
哪里$t
是要搜索的数组,并且'4'
是您正在搜索的级别(也可以是'1'
,'4.2'
等。
此外,一个有趣的笔记,免除第二参数平均值整个阵列,在这种情况下,我回来7.5(AVG(2,3,5,6,9,10,12,13))
你怎么能叫'chklevel(4.2.2)'当参数不是一个字符串?这会引发错误。另外,函数chklevel还没有返回任何东西,这是故意的吗?也许我只是没有把你的问题搞好。 – Czechnology 2011-03-05 21:16:38
对不起 - 更正。我可以发誓我在那里有引号。此外,它更像是一个伪代码而不是真正的代码,因为我有一个explode()来处理字符串。 – tommyvallier 2011-03-05 21:18:28
确保你看到我的更新,我添加了一个数组检查(你的4.2.2例子给我带来了麻烦,因为数组没有通过(值是),所以foreach被轰炸 - 但现在已经修复) – 2011-03-05 21:29:10