Come posso riassumere array ponderati in PHP?
-
04-07-2019 - |
Domanda
Come posso moltiplicare i valori di un array multidimensionale con pesi e riassumere i risultati in un nuovo array in PHP o in generale?
Il modo noioso assomiglia a questo:
$weights = array(0.25, 0.4, 0.2, 0.15);
$values = array
(
array(5,10,15),
array(20,25,30),
array(35,40,45),
array(50,55,60)
);
$result = array();
for($i = 0; $i < count($values[0]); ++$i) {
$result[$i] = 0;
foreach($weights as $index => $thisWeight)
$result[$i] += $thisWeight * $values[$index][$i];
}
Esiste una soluzione più elegante?
Soluzione
Dipende da cosa intendi per elegante, ovviamente.
function weigh(&$vals, $key, $weights) {
$sum = 0;
foreach($vals as $v)
$sum += $v*$weights[$key];
$vals = $sum;
}
$result = $values;
array_walk($result, "weigh", $weights);
EDIT: mi dispiace per non aver letto meglio il tuo esempio. Faccio risultato una copia di valori, poiché array_walk funziona come riferimento.
Altri suggerimenti
Hm ...
foreach($values as $index => $ary )
$result[$index] = array_sum($ary) * $weights[$index];
All'inizio avevo anche frainteso la domanda.
Immagino che con quella rappresentazione dei dati qualsiasi altra scelta sarebbe meno chiara di quella che hai.
Se potessimo cambiarlo in qualcos'altro, ad esempio se dovessimo trasporre la matrice e moltiplicare il contrario, sarebbe molto facile ottenere un modo più succinto e probabilmente elegante.
<?php
$weights = array(0.2,0.3,0.4,0.5);
$values = array(array(1,2,0.5), array(1,1,1), array(1,1,1), array(1,1,1));
$result = array();
for($i = 0; $i < count($values[0]); ++$i) {
$result[$i] = 0;
foreach($weights as $index => $thisWeight) {
$result[$i] += $thisWeight * $values[$index][$i];
}
}
print_r($result);
$result = call_user_func_array("array_map",array_merge(array("weightedSum"),$values));
function weightedSum() {
global $weights;
$args = func_get_args();
return array_sum(array_map("weight",$weights,$args));
}
function weight($w,$a) {
return $w*$a;
}
print_r($result);
?>