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?

È stato utile?

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

?>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top