You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SimpleXML排序XML列表时丢失重复日期事件节点的问题求助

问题原因

你遇到的问题核心是PHP数组的键具有唯一性:原代码用array_combine($dateArray, $eventXMLstringAray)将日期时间戳作为数组键,当多个活动日期相同时,后面的活动XML字符串会直接覆盖前面的,最终只保留最后一个同日期的活动。

修复方案

放弃array_combine的方式,转而构建包含日期与活动XML的二维数组,再通过usort自定义排序逻辑,这样同日期的活动会被完整保留并按日期排序。

修正后的代码如下:

$eventlist = new SimpleXMLElement('events.xml', null, true);

// 构建二维数组,存储每个活动的日期和对应XML内容
$events = [];
foreach ($eventlist->event as $event) {
    $eventdate = (string)$event->eventdate;
    // 转换DD-MM-YYYY格式日期为时间戳
    $date = mktime(0, 0, 0, substr($eventdate, 3, 2), substr($eventdate, 0, 2), substr($eventdate, 6, 4));
    $events[] = [
        'date' => $date,
        'xml' => $event->asXML()
    ];
}

// 按日期升序排序
usort($events, function($a, $b) {
    return $a['date'] - $b['date'];
});

// 拼接生成新的XML字符串
$newXMLStr = '<eventlist>';
foreach ($events as $item) {
    $newXMLStr .= $item['xml'];
}
$newXMLStr .= '</eventlist>';

// 保存更新后的XML文件
$newEventList = simplexml_load_string($newXMLStr);
$newEventList->asXML('events.xml');
关键改进点
  • 用二维数组存储活动数据,彻底避免键重复导致的内容覆盖
  • 通过usort自定义排序逻辑,确保所有活动都被保留并按日期排序
  • 显式转换$event->eventdate为字符串,规避SimpleXMLElement对象的潜在类型问题

内容的提问来源于stack exchange,提问作者Jason Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:15:07