内部数组的平均值


Average from inner array

我的任务是计算数组的平均值。

$arrayToTest = [[[1], 1], [[1,3,5,7], 4], [[2,5,4,1,2,3], 2.8],
    [[-1,-1,-1,-1,-1], -1], [[4,23,84,12,76,34,-7,-23], 25.375]];

从内部数组,所以对于example [1,3,5,7]和期望值为 4。我必须使用一个函数,我试过这个:

function arrayAverage ($arrayToTest)
{
   foreach($arrayToTest as $case)
      foreach ($case as $item)
      {
         $arraySum = array_sum($item);
         $arrayCount = array_count_values($item);
         $average = $arraySum / $arrayCount;
         return $average;
      }
}

但它不起作用。我觉得我在调用内部数组时做错了什么。

注释:

  • 我假设您希望计算最里面数组的平均值。
  • 下面的解决方案返回每个数组的平均值 - 而不是所有数组的平均值。但是 - 当然,您可以轻松地计算所有数组的平均值。
  • 因此,函数 arrayAverage(...返回一个平均值数组,而不是(仅)最后一个数组的平均值。
  • 我明确声明了输入数组(arrayToTest),因为可以更好地看到这样的数组结构(数组和标量数组)。

法典:

<?php
$arrayToTest = array (
    array(
        array(1),
        1
    ), 
    array(
        array(1,3,5,7), 
        4
    ),
    array(
        array(2,5,4,1,2,3),
        2.8
    ),
    array(
        array(-1,-1,-1,-1,-1), 
        -1
    ),
    array(
        array(4,23,84,12,76,34,-7,-23),
        25.375
    )
);
echo '<pre>'; print_r($arrayToTest); echo '</pre>';
$average = arrayAvarage ($arrayToTest);
echo '<pre>'; print_r($average); echo '</pre>';
function arrayAvarage ($arrayToTest) {
    $result = array();
    foreach($arrayToTest as $case) {
        foreach ($case as $items) {
            if (!is_array($items)) continue;  
            $result[] = array_sum($items) / count($items);
        }
    }  
    return $result;
}
?>

结果:

Array
(
    [0] => 1
    [1] => 4
    [2] => 2.8333333333333
    [3] => -1
    [4] => 25.375
)

如果您的数组在索引 0 中包含内部数组,则可以通过以下方式执行此操作:

function arrayAvarage ($arrayToTest)
{
   $out_put_arr = array();
   foreach($arrayToTest as $case)
      {
         $arraySum = array_sum($case[0]);
         $arrayCount = array_count_values($case[0]);
         $avarage = $arraySum / $arrayCount;
         $out_put_arr[]= $avarage;
      }
 return $out_put_arr;
}
所以主数组

的循环,主数组中的每个项目都会给你数组,int $case[0] = [1,3,5,7] 和 $case[1] = 4 ,你也不应该返回 for 循环,因为这只会返回第一个平均值。 因此,您可以声明新数组以填充所有平均值。

function average($array){
  return array_sum($array) / count($array);
}
foreach($arrayToTest as $array){
  echo "Average: " . average($array[0]);
}

您应该查看 $case数组的第一个元素,这是带有值的数组所在的实际位置。请注意,您也可以使用 array_sum 函数。

另外,您不应该像那样return,因为这会中断函数执行更多操作。所以,只有当你真的想这样做时,才return

由于您已经有了预期值,我认为您的函数没有理由再次返回这些平均值。相反,它可以验证这些预期值的正确性,并在比较失败时返回数组的索引。

function arrayAverage ($arrayToTest)
{
    foreach($arrayToTest as $index => $case) {
        $average = array_sum($case[0]) / count($case[0]);
        if ($average !== $case[1]) {
            return $index; // not expected value
        }
    }
    return false; // all averages are equal to expected value
}

因此,当所有平均值都符合预期时,上述函数将返回 FALSE。否则,它将返回第一个不匹配的索引。