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>