【问题标题】:PHP Standard Deviation. Array_map function not found inside class functionPHP 标准偏差。在类函数中找不到 Array_map 函数
【发布时间】:2013-12-09 17:05:49
【问题描述】:

我正在尝试使用 PHP 执行标准偏差。

我使用了我创建的这个函数there,因为stats_standard_deviation doesn't seem to be reliable

    <?php 
    class TestController extends \BaseController {

         function MyFunction() {
             $array = array('1','2','3','4');
             function sd_square($x, $mean) { return pow($x - $mean,2); } 

             function sd($array) { 
                      return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)) ); 
             } 
    } return sd($array)
} ?> 

问题是当我尝试使用它时它会返回array_map() expects parameter 1 to be a valid callback, function 'sd_square' not found or invalid function name

查看这里的一些帖子,我尝试将"sd_square" 更改为"self::sd_square"array($this, "sq_square")

【问题讨论】:

  • 请提供完整的上下文。这是在上课吗?两者在同一个?
  • 您的代码似乎没有任何问题。这些函数是否位于任何类中。你能发布完整的代码吗?
  • 统计扩展默认不与 PHP 绑定。你不是已经安装了吗? php.net/manual/en/stats.installation.php
  • 你在上课,所以sd_square()实际上是TestController::sd_square(),因此你必须将它用作回调,例如:array_map(array('TestController', 'sd_square'), ....)更多示例在PHP docs on callbacks
  • @Wistar return sd($array) is inside function sd () {} 这是一个错字吗?它应该在那个函数之外。

标签: php callback standard-deviation array-map


【解决方案1】:

这种回避问题(你应该解决它),但sq_square 足够小,你可能想考虑简单地内联

变化:

return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)) );

收件人:

return sqrt(array_sum(array_map(function ($x, $mean) { return pow($x - $mean,2); }, $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)) );

或者:

$sd_square = function ($x, $mean) { return pow($x - $mean,2); };
return sqrt(array_sum(array_map($sd_square, $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)) );

【讨论】:

  • 这并不是说你不应该弄清楚正在发生的作用域问题,但这是我喜欢匿名函数的用例(你也可以考虑预先分配给一个变量,比如$f = function ($x, $mean) { return pow($x - $mean,2); },这条线已经很长了)
  • 我猜我的课堂问题来自我正在使用的框架。我会用文档来解决这个问题。目前,匿名函数将完成这项工作。谢谢。
  • 很高兴这对你有用,但我真的不认为框架是你问题的原因。我建议您在有时间时重新组织/重构所有内容,并真正研究范围问题。他们很可能会再次出现。
  • @jon_darkstar,你的公式应该以/ (count($array)-1) );而不是/ (count($array)) );结尾。注意-1! (平方和除以 N-1 的平方根)。见:php.net/manual/en/function.stats-standard-deviation.php#97369
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
相关资源
最近更新 更多