I want to remove tasks that are older than today, but I can\'t quite figure out how to remove elements from XML file yet.
$xml_file = simplexml_load_file(\'file.
It's actually very tricky. You have to unset()
the appropriate variable, but it needs to be a reference to the parent node (i.e., unset($aTask)
will not work). Additionally, if you do foreach ($xml_file->task as $index => $aTask)
to keep track of the child position, you'll get task
in every iteration!
You need some ugly code like this:
$index = 0;
$remove = array();
foreach ($xml_file->task as $aTask) {
if ($aTask->date < $today) {
$remove[] = $index;
}
$index++;
}
foreach($remove as $index){
unset($xml_file->task[0]);
}
P.S. As already noted, your date handling routines do not work.
Edit: I've actually tried my own code and it works, so downvoter should explain himself.
I think it is problematic to compare dates as if it was an implemented type of datas.
With your algorithm, you are comparing strings, which is not what you want. You can use preg_match to get day, month and year, then mktime to compare timestamps:
http://php.net/manual/en/function.preg-match.php
http://php.net/manual/en/function.mktime.php
EDIT: You can even do that without preg_match, that is time consuming. Here is an example casting your object into an array (you have to cast one way or another, you can also select to use DOM, see: Remove a child with a specific attribute, in SimpleXML for PHP)
<?
$xml_file = (array)simplexml_load_file("file.xml")or die('Error reading XML file');
print_r($xml_file);
$today=array(
'day' => intval(date('d')),
'month' => intval(date('m')),
'year' => intval(date('Y')),
);
//print_r($today);
foreach($xml_file['task'] as $key=>$aTask) {
$date = (string)$aTask->date;
$month = intval($date[0].$date[1]);
$day = intval($date[3].$date[4]);
$year = intval($date[6].$date[7].$date[8].$date[9]);
//echo $aTask->title.': '.$month.'/'.$day.'/'.$year."\n";
if ( ($year < $today['year']) || ($year==$today['year'] && $month < $today['month']) || ($year==$today['year'] && $month == $today['month'] && $day < $today['day']) ) {
//echo 'Deleting '.$aTask->title."\n";
unset($xml_file['task'][$key]);
}
}
// Inspired from: https://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml
$xml = '<?xml version="1.0"?>'."\n".'<calendar>';
function addChild($item) { global $xml; $xml.=$item->asXML(); }
array_walk_recursive($xml_file['task'], 'addChild');
$xml .= '</calendar>';
//echo $xml;
file_put_contents('out.xml', $xml);
?>
Using simplexml
: --> live demo @ http://codepad.viper-7.com/Jl16Oh
$xml = simplexml_load_string($x); // XML is in $x
$today = date("m/d/Y");
$max = $xml->task->count()-1;
for ($i = $max; $i >=0; $i--) {
if ($xml->task[$i]->date < $today) unset($xml->task[$i]);
}