SimpleXML - это абстракция для DOM. $ child и $ child [0] являются отдельными объектами SimpleXMLElement, но имеют доступ к одному и тому же узлу DOM. Функция unset() не просто удаляет объект SimpleXMLElement, но также удаляет узел из DOM.
Итак, после этого объекты SimpleXMLElement ссылаются на удаленный узел DOM.
С небольшими изменениями в вашем примере, вы можете получить предупреждение за него:
$concerts = simplexml_load_string($xml);
foreach ($concerts->xpath('/*/cars/*') as $child) {
echo "Before= " .$child->asXml() ."\n";
unset($child[0]);
echo "After= " .$child->asXml() ."\n";
}
Выходные:
Before= <car_id>26395593</car_id>
Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19
After=
Before= <standart>0</standart>
Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19
After=
Before= <model>2</model>
Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19
After=
Вы должны избегать незаходимого объектов SimpleXmlElement. Сохраните исходный документ так же, прочитайте его значения и создайте новый XML-документ, если вам нужно сохранить данные в другом формате.
Чтобы "отключить" значение из узла XML, отлитый объект SimpleXMLElement в скаляр:
$concerts = simplexml_load_string($xml);
foreach ($concerts->xpath('/*/cars/*') as $child) {
$value = (string)$child;
echo "Before= " .$value."\n";
unset($child[0]);
echo "After= " .$value ."\n";
}
Выход:
Before= 26395593
After= 26395593
Before= 0
After= 0
Before= 2
After= 2
Это работает отлично. Может быть, у вас есть другой код, чем в вопросе? http://sandbox.onlinephpfunctions.com/code/d928e46b2dbb29eef9f53f6e40447ba4440c40e5 – Justinas