【问题标题】:Calculating Median of an array in PHP在 PHP 中计算数组的中位数
【发布时间】:2019-02-25 07:40:55
【问题描述】:

我试图弄清楚如何计算随机生成的数字数组的中位数。我已经设置了所有数组,但是我无法为计算组合一个函数。

这是我目前所拥有的:

//array 
$lessFifty = array();
$moreFifty = array();

//number generation
for ($i = 0; $i<=30; $i++) {
      $number = rand(0, 100);

//Sorting <50>      
if ($number < 50 ) {
    $lessFifty[] = $number;
} else {
    $moreFifty[] = $number; 
   } 
}
 echo print_r($lessFifty); 
 echo "<br>" ;
 echo print_r($moreFifty);

   //Average
echo "<p> Average of values less than fifty: </p>";
    print   array_sum($lessFifty) / count($lessFifty) ;
echo "<p> Average of values greater than fifty: </p>" ;  
    print   array_sum($moreFifty) / count($moreFifty) ;

//Median
$func = function (median ($array, $output = $median)){ 
    if(!is_array($array)){
        return FALSE;
    }else{
        switch($output){
                rsort($array);
                $middle = round(count($array) 2);
    $total = $array[$middle-1];
        break; 
    return $total;
    }
}

echo $func ; 

我很确定我做的这个中间部分是完全错误的。我只是在学习,事实证明这是一个挑战。

【问题讨论】:

    标签: php arrays median


    【解决方案1】:

    注意编写for() 循环的方式。如果你想要 30 个条目,那么你不应该使用 &lt;=,否则你会得到 31,因为 $i 以 0 开头。

    构建一个随机数数组,然后对它们进行排序。

    然后确定您是否有一个中心条目(奇数数组长度)或是否需要平均中间两个条目(偶数数组长度)。

    代码:(Demo)

    $limit = 30;  // how many random numbers do you want?  30 or 31?
    for ($i = 0; $i < $limit; ++$i) {
        $numbers[] = rand(0, 100);
    }
    var_export($numbers);
    
    //echo "\n---\nAverage: " , array_sum($numbers) / $limit;
    echo "\n---\n";
    
    sort($numbers);
    $count = sizeof($numbers);   // cache the count
    $index = floor($count/2);  // cache the index
    if (!$count) {
        echo "no values";
    } elseif ($count & 1) {    // count is odd
        echo $numbers[$index];
    } else {                   // count is even
        echo ($numbers[$index-1] + $numbers[$index]) / 2;
    }
    

    可能的输出:

    array (
      0 => 27,
      1 => 24,
      2 => 84,
      3 => 43,
      4 => 8,
      5 => 51,
      6 => 60,
      7 => 86,
      8 => 9,
      9 => 48,
      10 => 67,
      11 => 20,
      12 => 44,
      13 => 85,
      14 => 6,
      15 => 63,
      16 => 41,
      17 => 32,
      18 => 64,
      19 => 73,
      20 => 43,
      21 => 24,
      22 => 15,
      23 => 19,
      24 => 9,
      25 => 93,
      26 => 88,
      27 => 77,
      28 => 11,
      29 => 54,
    )
    ---
    43.5
    

    排序后,元素[14][15]分别持有4344。这些“中间两个”值的平均值是如何确定结果的。 (Hardcoded numbers demo)


    如果您想要一个简短、不灵活、硬编码的 sn-p,那么您可以使用 301415 作为您的预定大小和索引。

    for ($i = 0; $i < 30; ++$i) {
        $numbers[] = rand(0, 100);
    }
    sort($numbers);
    echo ($numbers[14] + $numbers[15]) / 2;
    

    【讨论】:

    • 哦,那么$i 应该等于我相信的一个。
    • 如果这是我的项目,我会留下 0 并将比较从 &lt;= 更改为 &lt;。不过这并不重要,因为sort() 无论如何都会刷新索引。
    • 大部分我都明白,但是(!$count) 部分中的! 有什么特别的作用?
    • 这是一个falsey 支票。当count()(又名sizeof())返回0 结果时,! 将捕获它并将条件评估为true。我也可以写成if ($count == 0) {if ($count === 0) {if ($count &lt; 1) {。我选择了最短的语法。
    • 抱歉,由于我完全不熟悉编码,因此我很难为我的一些查询找到合适的词。我继续前进并完成了旅行。谢谢你的帮助!我会努力改进的
    猜你喜欢
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多