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

変更しようとしてもエラーは発生しませんが、行の値には影響しません。重複する配列/オブジェクトを作成するのではなく、上書きすることをお勧めしますが、関数を実行するために必要に応じて新しいものを作成できます。

助けてくれてありがとう!

----EDIT---- わかりました。これで、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 に答える