PHP:多维数组的平均值

时间:2011-03-05 21:05:59

标签: php recursion average

我正在尝试构建一个工具来平衡PHP中多维数组的值。数组样本:

$t[1][1]=2;
$t[1][2]=3;
$t[2][1]=5;
$t[3]=6;
$t[4][1][1]=9;
$t[4][1][2]=10;
$t[4][2][1]=12;
$t[4][2][2]=13;

请注意,父母没有价值(因为他们有孩子)。我有这个:

function chklevel($s) {
  $l = explode(".",$s);
}

这使我能够将chklevel称为

chklevel("4.2.2")

让它返回13,但我也希望能够打电话

chklevel("4")

并返回11(这是4.1.1(9),4.1.2(10),4.2.1(12)和4.2.2(13)的平均值。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我必须在两个函数中执行它(仅仅因为搜索的递归性质,但这是我的出价:

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)

答案 1 :(得分:0)

这是我的解决方案:

function chklevel($t) {

  for ($i = 1; $i < func_num_args(); $i++) {
    if (is_array($t) && isset($t[func_get_arg($i)]))
      $t = $t[func_get_arg($i)];
  }

  return GetAvg($t);
}

function GetAvg($arr) {

  if (is_array($arr)) {
    $avg = 0;
    foreach ($arr as $v) {
      $avg += GetAvg($v);
    }
    $avg /= count($arr);

  } else if (is_numeric($arr)) {
    $avg = $arr;
  }

  return $avg;
}

我更喜欢这样的函数调用:chklevel($t, 4,2,2);但您可以轻松地修改字符串:

function chklevel($t, $s) {
  $indexes = explode(".", $s);
  for ($i = 0; $i < count($indexes); $i++) {
    if (is_array($t) && isset($t[$indexes[$i]]))
      $t = $t[$indexes[$i]];
  }

  return GetAvg($t);
}