Home > Mobile >  PHP showing XML calendar data - merge day events
PHP showing XML calendar data - merge day events

Time:11-25

I have the following XML file, which I can't edit.

<event>
<id>100</id>
<startdate>24/11/2021</startdate>
<description>Event Test 1</description>
</event>
<event>
<id>101</id>
<startdate>24/11/2021</startdate>
<description>Event Test 2</description>
</event>

I am then outputting this using simplexml_load_file($url) into a PHP file:

  $sxml = simplexml_load_file($url) or die("Error: Cannot create object");
foreach ($sxml->children() as $data)
{
echo "<li><h1>", $data->startdate . "</h1></li>";
echo "<li><h1>", $data->description . "</h1></li>";
}

This gives me an output as follows:

24/11/2021
Event Test 1
24/11/2021
Event Test 2

However, I would like to merge events by date, so the output would be as follows:

24/11/2021
    Event Test 1
    Event Test 2

How can I achieve this without editing the XML file?

Thanks!

CodePudding user response:

Since you are dealing with with xml, you are probably better off selecting your data using xpath.

To demonstrate, assume your xml looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<doc>    
   <event>
      <id>100</id>
      <startdate>24/11/2021</startdate>
      <description>Event Test 1</description>
   </event>
  <event>
     <event>
      <id>101</id>
      <startdate>24/11/2021</startdate>
      <description>Event Test 2</description>
   </event>
      <id>102</id>
      <startdate>24/12/2021</startdate>
      <description>Event Test 3</description>
   </event>
       <event>
      <id>103</id>
      <startdate>24/12/2021</startdate>
      <description>Event Test 4</description>
   </event>    
</doc>

Then in your code:

#search for all event start dates
$starts = $sxml->xpath('//event/startdate');

#get the unique start dates of these event
$dates = array_unique($starts);

foreach($dates as $date) {     
   echo "<li><h1>{$date}</h1></li>" ."\n";

   #search for all events taking place on each start date
   $expression = "//event/startdate[.='{$date}']";
   $events = $sxml->xpath($expression);
   
   #iterate through these events and find their desription
   foreach ($events as $event){
       echo "\t" , "<li><h1> {$event->xpath('./following-sibling::description')[0]}</h1></li>";
       echo "\n";
   }
   echo "\n";
}

Output:

<li><h1>24/11/2021</h1></li>
    <li><h1> Event Test 1</h1></li>
    <li><h1> Event Test 2</h1></li>

<li><h1>24/12/2021</h1></li>
    <li><h1> Event Test 3</h1></li>
    <li><h1> Event Test 4</h1></li>
  • Related