提问人:Jason Brown 提问时间:7/14/2023 更新时间:7/14/2023 访问量:21
SimpleXML - 对 XML 列表进行排序会删除日期重复的节点
SimpleXML - Sorting an XML list removes nodes with duplicate dates
问:
我有一个网站,它以 XML 列表的形式保存事件列表。客户端能够使用非常简单的基于 Web 的编辑器来编辑、删除和添加事件。这是 XML 列表的格式...
<?xml version="1.0"?>
<eventlist>
<event>
<eventtype>3-Bike Experience - Full Day</eventtype>
<location>Oulton Park, Cheshire</location>
<explevel>All</explevel>
<eventdate>26-07-2023</eventdate>
<eventprice>400.00</eventprice>
<trackprice>150.00</trackprice>
</event>
</eventlist>
我遇到的问题是,每当我对 XML 列表进行排序时,它都会删除共享同一日期的任何事件 - 实际上,无法列出同一天发生的事件。这是我用来对 XML 列表进行排序的代码......
$eventlist = new SimpleXMLElement('events.xml', null, true);
$dateArray = array();
$eventXMLstringAray = array();
foreach ($eventlist->event as $event)
{
$eventdate = $event->eventdate;
$date = mktime(0,0,0,substr($eventdate,3,2),substr($eventdate,0,2),substr($eventdate,6,4));
array_push($dateArray, $date);
array_push($eventXMLstringAray, $event->asXML());
}
$eventXMLstringAray = array_combine($dateArray, $eventXMLstringAray);
ksort($eventXMLstringAray);
$newXMLStr = '';
foreach ($eventXMLstringAray as $eventXMLstr)
{
$newXMLStr = $newXMLStr . $eventXMLstr;
}
$newXMLStr = '<eventlist>' . $newXMLStr . '</eventlist>';
$eventlist = simplexml_load_string($newXMLStr);
$eventlist->asXML('events.xml');
上面的排序代码使用每个事件的日期(以 $event->eventdate 保存)作为排序键,但它不是仅堆叠共享相同日期的事件,而是仅存储最近添加的事件。我完全被困住了!
答:
2赞
CBroe
7/14/2023
#1
array_combine
当然,如果您传递的第一个键数组包含任何重复项,则会覆盖数组条目。
您可以先将事件收集在日期下方的子数组中,以避免这种情况:
$eventXMLstringArray = array();
foreach ($eventlist->event as $event)
{
$eventdate = $event->eventdate;
$date = mktime(0,0,0,substr($eventdate,3,2),substr($eventdate,0,2),substr($eventdate,6,4));
$eventXMLstringArray[$date][] = $event->asXML();
}
ksort($eventXMLstringArray);
$newXMLStr = '';
foreach ($eventXMLstringArray as $eventXML)
{
$newXMLStr .= implode('', $eventXML);
}
$eventXML
在第二个循环中,现在将始终是一个数组 - 包含一个或多个事件。 使用空字符串作为分隔符会将它们连接在一起为一个字符串。implode
评论
0赞
Jason Brown
7/14/2023
你绝对的传奇!!!!这很完美。我对你感激不尽!!!!!谢谢!!!!!
评论