SimpleXML - 对 XML 列表进行排序会删除日期重复的节点

SimpleXML - Sorting an XML list removes nodes with duplicate dates

提问人:Jason Brown 提问时间:7/14/2023 更新时间:7/14/2023 访问量:21

问:

我有一个网站,它以 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 保存)作为排序键,但它不是仅堆叠共享相同日期的事件,而是仅存储最近添加的事件。我完全被困住了!

PHP 数组排序 日期 simplexml

评论


答:

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
你绝对的传奇!!!!这很完美。我对你感激不尽!!!!!谢谢!!!!!