2015-06-22 55 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

相关问题