2015-02-17 54 views
1

我試圖產生一個線圖,顯示應計合計爲一天一天。我寫了一個循環來找出每一天的總數,我認爲這個邏輯有意義。爲了驗證被比較的日期,我添加了兩個回聲語句,以便直觀比較並試圖逐步瞭解正在發生的事情。當我輸入兩個回聲語句時,數組開始按照我的預期工作,但我不知道爲什麼。我試圖通過var-dump來查看它是否是變量的類型,但是在任何一種情況下它都會調用$ date一個字符串。然而,如果沒有這兩個日期排列位置上的回聲聲明,我會得到總數的兩倍,因爲本月到目前爲止只有17天,並且我得到33或34個條目。有沒有一種方法來格式化它,使其繼續工作,但採取回聲陳述,因爲這最終將導入一個png文件?我確信答案很簡單,但我是新手。我很欣賞任何答案。Echo語句修復while循環問題莫名其妙,需要回聲出

while ($rows=odbc_fetch_row($result)){ 

    $unit=odbc_result($result,"unit_cost"); /*Rounding for Unit Cost*/ 
    $unit_cost=round($unit,2); 

    $ext=odbc_result($result,"ext_cost"); /*Rounding for Extended Cost*/ 
    $ext_cost=round($ext,2); 

    $date[]=odbc_result($result,"date_created"); 

    echo (prev($date)); 
    echo (end($date)); 

    if (prev($date) != end($date)){ //if previous element's date does not match current array's date: 
     $total[]=$sum; //report total summation to entry in total array, rezero sum variable. 
     $sum = 0; 
     $sum = $sum + $ext; 
    } 
    else{ //if both element's have same date: 
     $sum=$sum + $ext; //add extended cost of this line to total $sum, to be reported as an element in $total once this date is finished. 
    } 

}//end while 

print_r($total); 

回答

1

調用prev()end()實際移動陣列的內部記錄指針,它可以產生奇怪的行爲時,它正在積極地讀取和寫入。調用if()內部的這些函數進行!=比較會將數組的指針移動到一個令人困惑的地方。

解決方案而不是prev()/end()是將自ODBC獲取的行存儲在變量中,並且在每個循環迭代期間將其存儲爲$previous以與當前迭代的數組進行比較。

此外,我不建議將odbc_fetch_row()odbc_result()切換到odbc_fetch_array(),它將返回一個關聯數組,從而消除對odbc_result()的調用。

+0

謝謝你,這已經固定我的問題。是的,總和是在循環之外初始化的。我應該包括這一點。這非常有幫助。 – 2015-02-17 21:33:20

1

將代碼分解爲邏輯單元。首先,拉數據。其次,執行任何計算。

$extCosts = array(); 

while (odbc_fetch_row($result)) { // http://php.net/manual/en/function.odbc-result.php 

    $ext = odbc_result($result,"ext_cost"); 
    $ext_cost = round($ext,2); 
    $date = odbc_result($result,"date_created"); 

    $extCosts[$data][] = $ext_cost; 

} 

print_r($extCosts); 

陣列$ extCosts應該是這個樣子:

2015-01-01 
    2 
    1 
    5 
2015-01-02 
    2 
2015-01-03 
    4 
    7 

然後,只需使用PHP的陣列功能得到資金

$sums = array(); 
foreach ($extCosts as $k => $v) { 
    $sums[$k] = array_sum($v); 
} 

print_r($sums);