Стандартное отклонение PHP. Функция Array_map не найдена внутри функции класса

Я пытаюсь выполнить стандартное отклонение с помощью PHP.

Я использовал эту функцию, которую я основал там, потому что stats_standard_deviation не кажется надежным

    <?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").


person Wistar    schedule 09.12.2013    source источник
comment
Пожалуйста, предоставьте полный контекст. Это в классе? Оба в одном?   -  person kero    schedule 09.12.2013
comment
Кажется, в вашем коде нет никаких проблем. Находятся ли эти функции внутри какого-либо класса. Можете ли вы опубликовать полный код.   -  person Sabari    schedule 09.12.2013
comment
Расширение статистики не входит в состав PHP по умолчанию. Вы установили его, не так ли? php.net/manual/en/stats.installation.php   -  person vascowhite    schedule 09.12.2013
comment
@васкоуайт. я не пользуюсь пакетом   -  person Wistar    schedule 09.12.2013
comment
@kingkero я сделал правку   -  person Wistar    schedule 09.12.2013
comment
@Sabari Я сделал правку   -  person Wistar    schedule 09.12.2013
comment
Вы находитесь в классе, поэтому sd_square() на самом деле TestController::sd_square(), и поэтому вы должны использовать его как обратный вызов, например: array_map(array('TestController', 'sd_square'), ....) Дополнительные примеры находятся в Документация PHP по обратным вызовам   -  person Michael Berkowski    schedule 09.12.2013
comment
@ Майкл - но так ли это? sd_square тоже находится внутри MyFunction. Я не думаю, что TestController::sd_square() прав   -  person jon_darkstar    schedule 09.12.2013
comment
@jon_darkstar Действительно. Я не заметил этого из-за плохого отступа.   -  person Michael Berkowski    schedule 09.12.2013
comment
@Wistar Как вы вызываете эту функцию вне класса? Как передать $array на sd. Он должен работать нормально. У меня ошибок не показывает. Поскольку ваши функции находятся внутри MyFunction, к ним можно получить доступ в этой области.   -  person Sabari    schedule 09.12.2013
comment
Да, меня это тоже сбило с толку.   -  person jon_darkstar    schedule 09.12.2013
comment
@jon_darkstar Больше похоже на транслитерированный JavaScript, чем на PHP.   -  person Michael Berkowski    schedule 09.12.2013
comment
Вы пробовали array($this, "sd_square")? Вы написали, что пробовали array($this, "sq_square")!?   -  person l-x    schedule 09.12.2013
comment
@Майкл Ха, да, похоже. Попробуйте добавить () в конце, может быть? =П   -  person jon_darkstar    schedule 09.12.2013
comment
@ l-x Да, я пробовал array($this, "sd_square"), и это возвращает мне неопределенную переменную.   -  person Wistar    schedule 09.12.2013
comment
@Sabari Я звоню изнутри MyFunction   -  person Wistar    schedule 09.12.2013
comment
Попробуйте массив ('TestController', 'sd_square')   -  person LorenzoR    schedule 09.12.2013
comment
@Wistar return sd($array) находится внутри функции sd() {} это опечатка ?? он должен быть вне этой функции.   -  person Sabari    schedule 09.12.2013


Ответы (1)


Этот вид обходит проблему (и вы должны решить ее), но sq_square достаточно мал, и вы можете рассмотреть возможность простого встраивания

Изменять:

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

To:

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)) );

Or:

$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)) );
person jon_darkstar    schedule 09.12.2013
comment
Это НЕ означает, что вы не должны выяснять возникающие проблемы с областью действия, но это тот случай использования, когда мне нравятся анонимные функции (вы также можете подумать о назначении переменной прямо заранее, например, $f = function ($x, $mean) { return pow($x - $mean,2); }, эта строка чертовски длинная уже) - person jon_darkstar; 09.12.2013
comment
Я предполагаю, что моя проблема с классом связана с используемой мной структурой. Я разберусь с документацией. На данный момент анонимная функция будет выполнять эту работу. Спасибо. - person Wistar; 09.12.2013
comment
Рад, что это работает для вас, но я действительно не думаю, что фреймворк является причиной вашей проблемы. Я бы посоветовал вам реорганизовать/рефакторить все это и действительно изучить проблемы области, когда у вас есть время. Скорее всего, они появятся снова. - person jon_darkstar; 09.12.2013
comment
@jon_darkstar, ваши формулы должны заканчиваться на / (count($array)-1) );, а не на / (count($array)) );. Обратите внимание на -1! (квадратный корень из суммы квадратов, деленной на N-1). См.: php.net/manual/en/function. стандартное отклонение статистики.php#97369 - person SAVAFA; 14.12.2020