2011-10-29 33 views
5

Tôi sẽ cố gắng giải thích sự cố mà tôi có với mã này.Tự động tính tổng trong mảng

Tập lệnh này hoạt động tốt với tối đa ba người ($ 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 

Nhưng nếu tôi chỉ có bốn người ($ numRows = 4), tôi cần một cái gì đó như thế này:

$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 

Vì vậy, vấn đề là để tự động hóa những thay đổi trong mối quan hệ của $ numRows.

Đây là một bản demo của ma trận đại số:

Enter image description here

Điều duy nhất mà tôi muốn được đặt mã của tôi năng động trong một chức năng của số người.

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

Điều gì có thể khác trong trường hợp của tôi chỉ là số lượng người.

Thông tin thêm here.

+0

Câu hỏi của bạn là hoàn toàn rõ ràng. vui lòng viết lại câu hỏi của bạn – diEcho

+0

Vui lòng mô tả vấn đề theo các thuật ngữ tổng quát hơn, cố gắng tìm ra những gì bạn muốn làm từ một đoạn mã quá phức tạp không dễ dàng. Cấu trúc dữ liệu của bạn là gì? Bạn có một số biến '$ contaH0',' $ contaH1' v.v ...? Tại sao bạn không sử dụng mảng thay thế? – deceze

+0

không có vấn đề với mã ở trên. Điều duy nhất mà tôi muốn thực hiện là một số biến của các hàng tổng. nếu số $ numRows là 3, vì vậy phải có ba khoản tiền cho mỗi vòng lặp, nếu 4, phải có bốn khoản, nếu 5, phải có 5 tổng. Điều gì phải thay đổi là số lượng tiền có chức năng $ numRows – Daniel

Trả lời

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

đây là chính xác những gì tôi cần. cảm ơn – Daniel

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

cảm ơn một lần nữa. đầu ra sẽ là '([0] => 313.76656746 [1] => 0 [2] => 0 [3] => 0) [1] => 0)'.Và chính xác nên là một cái gì đó như thế này: '([0] => 0.320670055732 [1] => 0.324886219083 [2] => 0.19494002706 [3] => 0.159503698125)' cảm ơn cho nỗ lực – Daniel

0

Bạn có thể quan tâm đến các thư viện Math_Matrix mà sẽ giúp bạn làm tất cả các loại ma trận số học.

Các mã sau đây, tuy nhiên, tự động hóa giải pháp của bạn:

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

Ngoài ra, để buộc nó hơn vào cấu trúc ma trận hiện tại của bạn:

$matrix = array(); 
for ($z = 0; $z < $numRows; $z++) { 
    $matrix[] = ${'contaH'.$z}; 
} 
Các vấn đề liên quan