2011-10-29 19 views
5

このコードで問題があるかどうかを説明しようとします。配列内の合計を自動化

このスクリプトは、最大3人($ 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 

しかし、私は唯一の4人を持っている場合($ numRowsの数= 4)、私はこのような何かが必要です。

$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 

だから、問題は$ numRowsの数の関係で、これらの変更を自動化することです。ここで

は行列代数のデモです:

Enter image description here

私が望む唯一のことは、人々の数の関数で動的に私のコードを入れています。

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

私の場合は何人かは人の数だけです。

詳細情報here

+0

あなたの質問は全く不明です。あなたの質問を書いてください。 – diEcho

+0

問題をより一般的な言葉で説明してください。複雑すぎるコードから何をしたいのか分かりません。あなたのデータ構造は何ですか?いくつかの変数 '$ contaH0'、' $ contaH1'などはありますか?代わりに配列を使用していないのはなぜですか? – deceze

+0

上記のコードに問題はありません。私が実装したい唯一のものは、可変数の合計行です。 $ numRowsの数が3の場合、ループごとに3つの合計が必要です.4の場合は合計が4つ、5の場合は合計が5つ必要です。変更する必要があるのは$ numRowsの関数での合計数です – Daniel

答えて

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

これはまさに私が必要なものです。ありがとう – Daniel

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

に感謝しています。出力は '([0] => 313.76656746 [1] => 0 [2] => 0 [3] => 0)[1] => 0)'になります。'([0] => 0.320670055732 [1] => 0.324886219083 [2] => 0.19494002706 [3] => 0.159503698125)'努力のおかげで – Daniel

0

あなたは行列演算のすべてのソートを行うのに役立ちますMath_Matrixライブラリに興味があるかもしれません。

次のコードは、しかし、あなたのソリューションを自動化します。

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

、既存のマトリックス構造に多くのそれを結ぶために:

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