Ниже мой массив. я хочу найти значит и мода.
Если значение является числовым, то среднее значение функции выполнено и найдено среднее значение, и результат помещается в нулевое пространство, а также, если значение является строковым типом, найдите режим (наиболее повторяющееся значение) и поместите это значение в нулевое пространство …
Как я могу сделать две функции, чтобы найти среднее значение и режим, и как я оцениваю значение как числовое и строковое, затем применить функцию и заполнить пробелы?
Array
[1] => Array
(
[1] => 4
[2] => 2
[3] => 3
[4] =>
)
[2] => Array
(
[1] => one
[2] => two
[3] => two
[4] =>
)[3] => Array
(
[1] => 8
[2] =>
[3] => 8
[4] => 5
)
}
Вам нужно будет использовать следующие операторы и функции:
foreach
: перебирать элементы&
: не обязательно, но этот префикс облегчает изменение массива, пока вы перебираете его элементы.Вот функция, которая заполняет промежутки средним значением и режимом:
function meanAndMode(&$data) {
// repeat for each row in the data
foreach($data as &$row) {
$sum = 0;
$mode = "";
$numbers = 0;
$numeric = true;
$emptySlots = [];
foreach($row as $index => &$value) {
if (empty($value)) {
// remember where the empty slot(s) are, using "&"$emptySlots[] = &$value;
} else {
// all entries must be numeric to get the average,
// otherwise they will be used as strings for get the mode.
$numeric = $numeric && is_numeric($value);
if ($numeric) {
// numeric: add up and count for
// allowing mean to be calculated later
$sum += $value;
$numbers++;
}
// for numeric and non-numeric: keep count per string
$count[$value] = empty($count[$value]) ? 1
: $count[$value] + 1;
// keep track of highest recurrence count
if (!$mode || $count[$value] > $count[$mode]) {
$mode = $value;
}
}
}
// Put result in empty slot(s). In case of numeric input,
// the average needs to be calculated still:
$result = $numeric ? $sum / $numbers : $mode;
foreach ($emptySlots as &$emptySlot) {
$emptySlot = $result;
}
// avoid that the same slot is used in a next iteration that might
// treat a row without an empty slot.
unset($emptySlots);
}
}
Вот как бы вы назвали это:
// test data
$data = array(
array(4, 2, 3, null),
array("one","two","two", null),
array(8, null, 8, 5)
);
// apply function to fill in the blanks
meanAndMode($data);
// show result
var_export ($data);
Выход:
array (
0 =>
array (
0 => 4,
1 => 2,
2 => 3,
3 => 3,
),
1 =>
array (
0 => 'one',
1 => 'two',
2 => 'two',
3 => 'two',
),
2 =>
array (
0 => 8,
1 => 7,
2 => 8,
3 => 5,
),
)
Обратите внимание, что эта функция всегда вычисляет режим, но если в конце она находит, что все элементы были числовыми, оно заполняет пробел средним значением и игнорирует режим. Таким образом, функция будет хорошо работать при смешении числовых и нечисловых данных. В этом случае все будет интерпретировано как нечисловое.
Если имеется более одного пустого слота, все они получат значение результата.
Других решений пока нет …