【问题标题】:Alter specific array values based on others in same "row"根据同一“行”中的其他值更改特定数组值
【发布时间】:2015-06-22 02:27:23
【问题描述】:

我正在尝试根据同一行中的其他值对返回的 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 一起使用”。所以,现在我正在努力……

【问题讨论】:

    标签: php arrays foreach calculated-field array-walk


    【解决方案1】:

    您需要添加一个& 以让$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.

    【讨论】:

    • foreach循环之后不要忘记unset($row);,否则如果在以下代码的其他地方访问$row,您可能会得到意想不到的副作用。
    • 好的,所以我在 scrowler 发布的同时发现了参考问题(感谢 Scrowler)。但是,正如您在我的编辑中看到的那样,它给我留下了另一个我不明白的问题。
    • 感谢您提供的示例,Scrowler,它们很有帮助。我的 $filterobject; 一定有什么愚蠢的地方;您示例中的代码对我不起作用; foreach 方法返回我提到的致命错误,array_walk 似乎失败了,但没有返回错误。
    • @Wavelength 这将是因为您的数据库查询返回的数据类型。在不知道您正在使用哪个驱动程序的情况下,很难提出修复建议,但是在您的查询调用之后,“黑客”将执行此操作:$temp = []; foreach ($filterobject as $row) { $temp[] = $row; } $filterobject = $temp; 将其强制为标准 PHP 数组。除此之外,尝试var_dumping $row 来检查它的属性。
    • 漂亮!谢谢你,爬虫!转换为数组和 get_object_vars 都失败了,但是结合引用的小技巧可以解决问题。我必须弄清楚我的结果对象发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2021-11-30
    • 2018-06-22
    • 2022-07-28
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多