2011-10-29 11 views
5

Cercherò di spiegare il problema che ho con questo codice.Automate sum in array

Questo script funziona bene fino a tre persone ($ numRows = 3).

$z=0; 
$i=0; 
$x=0; 

do { 
    $total[] = (
     ${'contaH'.$z}[$i+0]*$final[$x+0]+ 
     ${'contaH'.$z}[$i+1]*$final[$x+1]+ 
     ${'contaH'.$z}[$i+2]*$final[$x+2] 
    ); 
    $z++; 
} while ($z<$numRows); //3 

Ma se devo solo quattro persone ($ numRows = 4), ho bisogno di qualcosa di simile:

$z=0; 
$i=0; 
$x=0; 

do { 
    $total[] = (
     ${'contaH'.$z}[$i+0]*$final[$x+0]+ 
     ${'contaH'.$z}[$i+1]*$final[$x+1]+ 
     ${'contaH'.$z}[$i+2]*$final[$x+2]+ 
     ${'contaH'.$z}[$i+3]*$final[$x+3] 
     // if they are 5 persons ($numRows=5), here, should exists another row 
    ); 
    $z++; 
} while ($z<$numRows); //4 

Quindi il problema è quello di automatizzare questi cambiamenti nella relazione di $ numRows.

Ecco una demo di algebra delle matrici:

Enter image description here

L'unica cosa che voglio è messo in modo dinamico il mio codice in funzione del numero di persone.

A | B | C | D 
Person1 
Person2 
Person3 
Person4 
... 

Ciò che può essere diverso nel mio caso è solo il numero di persone.

Ulteriori informazioni here.

+0

la tua domanda è del tutto chiaro. per favore scrivi nuovamente la tua domanda – diEcho

+0

Descrivi il problema in termini più generali, cercando di capire cosa vuoi fare da un pezzo di codice complicato non è facile. Qual è la tua struttura dati? Avete diverse variabili '$ contaH0',' $ contaH1' etc? Perché invece non usi gli array? – deceze

+0

non ci sono problemi con il codice sopra. L'unica cosa che voglio implementare è un numero variabile di righe somma. se il numero di $ numRows è 3, quindi deve avere tre somme per ogni ciclo, se 4, deve avere quattro somme, se 5, deve avere 5 somme. Ciò che deve cambiare è il numero di somme in funzione di $ numRows – Daniel

risposta

2
$z=0; 
$i=0; 
$x=0; 
$numRows = 5; 

do{ 
    $currentSum = 0; 
    for($c = 0; $c < $numRows; $c++){ 
     $currentSum += (${'contaH'.$z}[$i+$c] * $final[$x+$c]); 
    } 
    $total[] = $currentSum; 
    $z++; 
}while($z < $numRows); 
+0

questo è esattamente ciò di cui ho bisogno. Grazie – Daniel

0
$subtotal = 0; 
for ($i = 0; $i < $numRows; $i++) { 
    $subtotal += ${'contaH'.$z}[$i] * $final[$i]; 
} 
$total[] = $subtotal; 
+0

grazie ancora. l'output sarà '([0] => 313.76656746 [1] => 0 [2] => 0 [3] => 0) [1] => 0)'.E il corretto dovrebbe essere qualcosa del tipo: '([0] => 0.320670055732 [1] => 0.324886219083 [2] => 0.19494002706 [3] => 0.159503698125)' grazie per lo sforzo – Daniel

0

Potreste essere interessati nella biblioteca Math_Matrix che vi aiuterà a fare ogni sorta di matrice di aritmetica.

Il codice seguente, tuttavia, la soluzione automatizza:

function mat_mult($matrix, $vector) { 
    $result = array(); 
    $matrixWidth = count($matrix[0]); 
    for ($z = 0; $z < $matrixWidth; $z++) { 
     $value = 0; 
     for ($y = 0; $y < $matrixWidth; $y++) { 
      $value += $matrix[$z][$y]*$vector[$y]; 
     } 
     $result[] = $value; 
    } 
    return $result; 
} 

$matrix = array(
    array(1, 1/3.0, 2, 4), 
    array(3, 1, 5, 3), 
    array(1/2.0, 1/5.0, 1, 1/3.0), 
    array(1/4.0, 1/3.0, 3, 1) 
); 
$vector = array(0.26, 0.50, 0.09, 0.16); 

$v2 = mat_mult($matrix, $vector); 

print_r($v2); 

Inoltre, di legarlo di più nella vostra struttura matrice esistente:

$matrix = array(); 
for ($z = 0; $z < $numRows; $z++) { 
    $matrix[] = ${'contaH'.$z}; 
}