【问题标题】:Average from inner array内部数组的平均值
【发布时间】:2016-01-24 10:56:47
【问题描述】:

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

$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;
      }
}

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

【问题讨论】:

  • 你不应该return,它会在没有完成所有工作的情况下立即结束函数。你真正需要什么?您是否需要验证每个预期值是否正确?还是您想忽略该信息?应该是什么输出,因为你会有很多平均值?一个数组?
  • 平均值已经有了,还有什么要计算的?
  • 内部数组是[1,3,5,7], 4][1,3,5,7]] ? 正确编写示例数组
  • 如果您将 $case 更改为 $case[0] 顺便说一句,您的代码将起作用
  • 您能否提供输入数组是什么,以及预期的输出数组会是什么样子?

标签: php multidimensional-array foreach


【解决方案1】:

评论:

  • 我假设您希望计算最内层数组的平均值。
  • 以下解决方案返回每个数组的平均值,而不是所有数组的平均值。但是 - 当然,您可以轻松计算所有数组的平均值。
  • 因此函数 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
)

【讨论】:

    【解决方案2】:

    如果您的数组在索引 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 循环中,因为这将仅返回第一个平均值。因此您可以声明新数组以填充所有平均值。

    【讨论】:

      【解决方案3】:
      function average($array){
        return array_sum($array) / count($array);
      }
      
      foreach($arrayToTest as $array){
        echo "Average: " . average($array[0]);
      }
      

      【讨论】:

        【解决方案4】:

        您应该查看 $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。否则会返回第一个不匹配的索引。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-30
          • 2018-07-12
          • 1970-01-01
          • 1970-01-01
          • 2020-12-15
          • 2013-10-25
          • 2016-11-08
          相关资源
          最近更新 更多