PHP, использующий foreach, при изменении следующего значения возвращает фатальную ошибку

1

У меня есть PHP-код, который смотрит в массив xml; то, что я хочу сделать, это изменить следующее значение этой находки. Я могу правильно отследить вывод, но при попытке изменить значение я получаю фатальную ошибку.

Я называю свою функцию следующим образом:
$ xml = replaceDeleteOrAddMethod ("void", "method", "put", $ templateID_category, $ xml, "category", "itsastring");

и созданная мной функция выглядит так:

function replaceDeleteOrAddMethod($element, $methodName, $methodValue, $newValue, $xml, $methodstringname, $methodvartype)
{
    //echo "replacing Value for: " .  $propertyValue;
  foreach ($xml->xpath("//" . $element) as $tmp)
  {
    //echo $tmp->string . "<br>"; 
    if((string) $tmp[$methodName] == $methodValue )
    {
        if ($tmp->string == $methodstringname)
        {
            switch ($methodvartype){
                case "itsastring":
                    echo $tmp->string . "<br>";
                    echo next($tmp->string) . "-> NewValue: " . $newValue . "<br>";
                    next($tmp->string) = $newValue;
                break;
                case "itsaint":
                    echo $tmp->int . "<br>"; 
                    next($tmp->int) = $newValue;
                break;
                case "itsabool":
                    echo $tmp->bool . "<br>"; 
                    next($tmp->bool) = $newValue;
                break;
            }
        }
    }
  }
  return($xml);

}

Если я $tmp-> string = $ newValue, я могу редактировать строку с новым значением; но следующий ($tmp-> string) = $ newValue; дает мне фатальную ошибку.

Спасибо за помощь.

  • 0
    возможный дубликат PHP - изменить текущий объект в цикле foreach
  • 0
    это не то же самое, я не говорю о ссылках с помощью & я говорю, почему использование next не позволяет мне изменить значение, но повторяет, что следующее vlaue работает
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Значение не может быть присвоено (в PHP или любом языке программирования для смертных).

Здесь упрощенный пример:

$ints = array(1, 2, 3, 4, 5);
$first = current($ints);      // $first = 1;
next($ints) = 99;             // 2 = 99;

Это не имеет смысла. next($ints) в этом контексте возвращает 2. Ему не может быть присвоено значение 99.


Неясно, являются ли $tmp->string (или ее братья и сестры в фрагменте кода) массивами. next будет иметь желаемое поведение при работе с массивом.

Предполагая, что вы хотите сделать, это действие на следующий элемент в вашем цикле XPath, вместо этого вы можете создать триггерную переменную (например, $matched = false;). В "match" установите его равным true, а затем на следующей итерации проверьте, соответствует if($matched == true); если это так, то замените текущее значение на $newValue.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню