2015-06-22 8 views
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){ 

Однако я получаю ошибку «Итератор не может быть использован с Еогеаспом по ссылке». Итак, теперь я работаю над этим ...

ответ

0

Вам необходимо добавить &, чтобы обновлять ссылку по ссылке $row, иначе он будет перезаписан при каждом цикле и не будет сохраняться за пределами foreach.

Кроме того, я предполагаю, что ваша проверка adjboolean должна быть скорее сравнением, чем назначением? Используйте == вместо =.

foreach ($filterobject as &$row){ 
    if ($row['adjboolean'] == 1) { 
     $row['value'] += ($row['value'] * ($input1/$input2 - 1) * $row['adjfactor']); 
    } 
} 

FYI, 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.

+0

Не забывайте 'unset ($ row);' после этого цикла 'foreach', иначе вы можете получить неожиданные побочные эффекты, если' $ row' доступен в другом месте следующего кода. – CBroe

+0

ОК, поэтому я выяснил ссылочную проблему в то же время, когда scrowler отправлял (спасибо Scrowler). Однако, как вы можете видеть в моем редактировании, это оставило мне еще одну проблему, которую я не понимаю. – Wavelength

+0

Спасибо за примеры, Scrowler, они были полезны. Должно быть что-то глупое с моим $ filterobject; код из ваших примеров не работает для меня; foreach подход возвращает фатальную ошибку, о которой я упоминал, array_walk, похоже, терпит неудачу, но при этом не возвращается ошибка. – Wavelength