Php 基于同一“中的其他值更改特定数组值”;“世界其他地区”;
我试图基于同一行中的其他值,对返回的SQL对象中的值执行转换/计算。我找不到一个好的参考,也许我只是不知道我在寻找什么;似乎大多数函数(如array_walk)都用于对整个数组中的所有值应用相同的转换?我只想有条件地改变某些值 这是我的简化尝试;不起作用,但我想我想表明我在做什么: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
//------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_变量都失败了,但是这个小技巧结合了引用就成功了。我必须弄清楚我的结果对象发生了什么。