Intereting Posts
file_get_contents синхронный или асинхронный Есть ли альтернатива heredoc в Java (heredoc как PHP)? Как зашифровать вывод исходного кода HTML с помощью PHP Почему W3C Validator не принимает теги <? Php include () в HTML5? setlocale не влияет на PHP SQL-дизайн и / или класс PHP для хранения динамических двумерных массивов? Как сделать форму, отправьте PHP-способ с помощью Angularjs? страницу поиска, которая позволяет пользователю выбирать между тремя типами, используя php mysql HTML-форма, передающая два массива разметки PHP (специальный случай, который я думаю) Загрузка файла с использованием PHP CURL Я NetBeans, могу ли я каким-либо образом сохранить отпечаток ключа RSA на удаленном сервере или не подтвердить NetBeans ключ до принятия решения? Можно ли ограничивать маршрут только для AJAX? Как начать использовать и разрабатывать на Ubuntu Linux? Эффективность Preg_replace Извлечение изображений из файла Excel (xlsx) с помощью PHP

Удалить определенные элементы из XML с помощью PHP

Первоначально я хочу разбить 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]); } }