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
相关产品推荐
相关产品推荐

