Мне пришлось сделать это в двух функциях (только из-за рекурсивного характера поиска, но вот моя ставка:
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) )