2015-06-22 70 views
0

我想根據同一行中的其他值對返回的SQL對象中的值執行變換/計算。我找不到一個很好的參考,也許我只是不知道我在找什麼;似乎大多數函數(例如array_walk)用於將相同的變換應用於整個數組中的所有值?我想有條件地改變某些值。基於同一行中的其他數據修改特定的數組值

這是我的簡化嘗試;不工作,但我想說明什麼,我試圖做的:

//------CREATE OBJECT-------// 
$sql2 = "select internalname, value, adjboolean, adjfactor 
     FROM superfilters WHERE id > '0'"; 

$filterobject = $DBLink->query($sql2); 

//------MODIFY OBJECT------// 

$input1 = 350; 
$input2 = 175; 

foreach ($filterobject as $row){ 
    if ($row['adjboolean'] = 1) { 
     $row['value'] += ($row['value'] * ($input1/$input2 - 1) * $row['adjfactor']); 
    } 
} 

試圖修改後,不會引發任何錯誤,但在我行的價值沒有影響。我寧願重寫,也不創建重複的數組/對象,但如果需要執行此功能,我可以創建新的。

非常感謝您的幫助!

----編輯---- 好吧,所以我現在已經瞭解到foreach實際上在我的$ filterobject的副本上工作,並且我必須引用才能修改實際的結果對象。看來下面應該工作

foreach ($filterobject as &$row){ 

不過,我得到錯誤「的迭代器不能被引用用foreach使用」。所以,現在我正在努力...

回答

0

您需要添加一個&以使$row通過引用進行更新,否則每次循環時它都會被覆蓋,並且不會在foreach之外持續存在。

此外,我假設你的adjboolean檢查應該是比較而不是任務?使用==而不是=

foreach ($filterobject as &$row){ 
    if ($row['adjboolean'] == 1) { 
     $row['value'] += ($row['value'] * ($input1/$input2 - 1) * $row['adjfactor']); 
    } 
} 

僅供參考,array_walk()會走爲好,你只需要use您的外部變量,讓他們可以在回調的範圍內訪問:

array_walk(
    $filterobject, 
    function(&$row, $key) use($input1, $input2) { 
     if ($row['adjboolean'] == 1) { 
      $row['value'] += ($row['value'] * ($input1/$input2 - 1) * $row['adjfactor']); 
     } 
    } 
); 

Examples here

+0

不要忘記'unset($ row);'在那個'foreach'循環之後,否則如果在下面的代碼中訪問'$ row'時你可能會意想不到的副作用。 – CBroe

+0

好的,所以我想出了Scrowler發佈的同時參考問題(謝謝Scrowler)。但是,正如你在我的編輯中看到的那樣,它給我留下了另一個我不明白的問題。 – Wavelength

+0

謝謝你的例子,Scrowler,他們很有幫助。我的$ filterobject肯定有些東西是愚蠢的;你的例子中的代碼不適合我; foreach方法返回我提到的致命錯誤,array_walk似乎失敗,但沒有返回錯誤。 – Wavelength

相關問題