Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于同一“中的其他值更改特定数组值”;“世界其他地区”;_Php_Arrays_Foreach_Calculated Field_Array Walk - Fatal编程技术网

Php 基于同一“中的其他值更改特定数组值”;“世界其他地区”;

Php 基于同一“中的其他值更改特定数组值”;“世界其他地区”;,php,arrays,foreach,calculated-field,array-walk,Php,Arrays,Foreach,Calculated Field,Array Walk,我试图基于同一行中的其他值,对返回的SQL对象中的值执行转换/计算。我找不到一个好的参考,也许我只是不知道我在寻找什么;似乎大多数函数(如array_walk)都用于对整个数组中的所有值应用相同的转换?我只想有条件地改变某些值 这是我的简化尝试;不起作用,但我想我想表明我在做什么: //------CREATE OBJECT-------// $sql2 = "select internalname, value, adjboolean, adjfactor FROM supe

我试图基于同一行中的其他值,对返回的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 by reference一起使用”。所以,现在我正在研究…

您需要添加一个
&
,以便通过引用更新
$row
,否则它将在每次循环时被覆盖,并且不会在foreach之外持久存在

另外,我假设您的
adjboolean
检查应该是比较而不是赋值?使用
=
代替
=

foreach ($filterobject as &$row){
    if ($row['adjboolean'] == 1) {
        $row['value'] += ($row['value'] * ($input1 / $input2 - 1) * $row['adjfactor']);
    }
}
仅供参考,
array\u walk()
也将进行walk,您只需
使用
您的外部变量,即可在回调范围内访问它们:

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

.

别忘了
unset($row)
foreach
循环之后,否则如果在下面的代码中的其他地方访问
$row
,您可能会得到意外的副作用。好的,所以我在scrowler发布的同时解决了参考问题(感谢scrowler)。然而,正如你在我的编辑中看到的,它给我留下了另一个问题,我不明白。谢谢你的例子,斯克鲁勒,它们很有帮助。我的$filterobject肯定有点傻;您示例中的代码对我不起作用;foreach方法返回我提到的致命错误,array_walk似乎失败了,但没有返回任何错误。这是因为DB查询返回的数据类型。如果不知道您使用的是哪个驱动程序,很难提出修复建议,但“黑客”会在您的查询调用后执行此操作:
$temp=[];foreach($filterobject作为$row){$temp[]=$row;}$filterobject=$temp
强制将其作为标准PHP数组。然后,尝试
var\u dump
ing
$row
检查它的属性。真漂亮!谢谢你,史克鲁勒!强制转换为数组和get_object_变量都失败了,但是这个小技巧结合了引用就成功了。我必须弄清楚我的结果对象发生了什么。