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 一起使用”。所以,现在我正在努力...

4

1 回答 1

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']);
        }
    }
);

这里的例子

于 2015-06-22T22:48:52.210 回答