Я пытаюсь выполнить преобразование/вычисление значений в возвращаемом объекте 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){
Однако я получаю ошибку «Итератор не может быть использован с Еогеаспом по ссылке». Итак, теперь я работаю над этим ...
Не забывайте 'unset ($ row);' после этого цикла 'foreach', иначе вы можете получить неожиданные побочные эффекты, если' $ row' доступен в другом месте следующего кода. – CBroe
ОК, поэтому я выяснил ссылочную проблему в то же время, когда scrowler отправлял (спасибо Scrowler). Однако, как вы можете видеть в моем редактировании, это оставило мне еще одну проблему, которую я не понимаю. – Wavelength
Спасибо за примеры, Scrowler, они были полезны. Должно быть что-то глупое с моим $ filterobject; код из ваших примеров не работает для меня; foreach подход возвращает фатальную ошибку, о которой я упоминал, array_walk, похоже, терпит неудачу, но при этом не возвращается ошибка. – Wavelength