Первоначально я хочу разбить XML-файл на два файла. Поэтому я должен удалить некоторые элементы.
XML выглядит так:
<?xml version="1.0"?> <events> <event> <id>1</id> <typ>new</typ> </event> <event> <id>2</id> <typ>new</typ> </event> <event> <id>3</id> <typ>old</typ> </event> <event> <id>4</id> <typ>new</typ> </event> <event> <id>5</id> <typ>old</typ> </event> <event> <id>6</id> <typ>old</typ> </event> <event> <id>7</id> <typ>old</typ> </event> </events>
Что мне нужно:
<?xml version="1.0"?> <events> <event> <id>1</id> <typ>new</typ> </event> <event> <id>2</id> <typ>new</typ> </event> <event> <id>4</id> <typ>new</typ> </event> </events>
Поэтому мне нужно удалить все события с помощью typ
= old
. Я пробовал это так:
$events = file_get_contents("events.xml"); $doc = new SimpleXMLElement($events); foreach($doc->event as $seg) { if ($seg->typ == 'new') { echo "$seg->typ<br />"; unset($doc->event[$seg]); } } echo $doc->asXml();
с$events = file_get_contents("events.xml"); $doc = new SimpleXMLElement($events); foreach($doc->event as $seg) { if ($seg->typ == 'new') { echo "$seg->typ<br />"; unset($doc->event[$seg]); } } echo $doc->asXml();
Но только эхо правильное, остальное все равно одно и то же. Затем я нашел эту функцию:
function delete_event_typ($typ, $filename = 'events.xml'){ $data = simplexml_load_file($filename); for($i = 0, $length = count($data->event); $i < $length; $i++){ if($data->event[$i]->typ == $typ){ unset($data->event[$i]); } } file_put_contents($filename, $data->saveXML()); } //SAMPLE USAGE delete_event_typ('old');
сfunction delete_event_typ($typ, $filename = 'events.xml'){ $data = simplexml_load_file($filename); for($i = 0, $length = count($data->event); $i < $length; $i++){ if($data->event[$i]->typ == $typ){ unset($data->event[$i]); } } file_put_contents($filename, $data->saveXML()); } //SAMPLE USAGE delete_event_typ('old');
Но он удаляет не все записи, это выглядит так:
<?xml version="1.0"?> <events> <event> <id>1</id> <typ>new</typ> </event> <event> <id>2</id> <typ>new</typ> </event> <event> <id>4</id> <typ>new</typ> </event> <event> <id>6</id> <typ>old</typ> </event> </events>
Так что еще я могу сделать? Есть идеи?
Сделать цикл в обратном порядке
for($c = count($doc->event); $c >= 0 ; $c--) { if ($doc->event[$c]->typ == 'old') { unset($doc->event[$c]); } }
сfor($c = count($doc->event); $c >= 0 ; $c--) { if ($doc->event[$c]->typ == 'old') { unset($doc->event[$c]); } }