PHP按XML节点type值筛选分类进港/离港航班数据实现方法
WordPress下按类型分栏展示XML进港/离港航班实现方案
实现逻辑
你现有代码直接按固定索引读取航班节点,没有做类型判断,因此无法区分进港、离港数据。实现分类展示只需要两步:
- 加载XML后,按
<type>节点的取值把航班数据拆分为进港、离港两个数据集 - 用简单的HTML两列布局,分别渲染两个数据集的内容即可
可直接使用的代码(适配PHPCode Snippets插件)
你可以直接把下面代码粘贴到snippet中执行,已经适配WordPress环境,自带基础两列样式,你可以根据需要调整展示的字段和样式:
<?php // 开启XML错误捕获,避免远程加载失败导致页面报错 libxml_use_internal_errors(true); // 加载远程XML文件,替换成你自己的XML地址 $xml = new SimpleXMLElement('https://XXX/fids.xml', null, true); if (!$xml) { echo "航班数据加载失败,请稍后重试"; libxml_clear_errors(); return; } // 方法1:用XPath直接筛选对应类型的航班,无需手动循环 $arrivalFlights = $xml->xpath('//flight[type="arrival"]'); $departureFlights = $xml->xpath('//flight[type="departure"]'); /* 方法2:如果不想用XPath,也可以手动遍历分组 $arrivalFlights = []; $departureFlights = []; foreach ($xml->flight as $item) { if ((string)$item->type === 'arrival') { $arrivalFlights[] = $item; } elseif ((string)$item->type === 'departure') { $departureFlights[] = $item; } } */ ?> <!-- 两列布局容器 --> <div style="display: flex; gap: 2rem; flex-wrap: wrap; margin: 2rem 0;"> <!-- 进港航班列 --> <div style="flex: 1; min-width: 300px;"> <h3>进港航班</h3> <table style="width: 100%; border-collapse: collapse;"> <thead> <tr> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">航班号</th> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">航司</th> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">始发机场</th> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">计划到港时间</th> </tr> </thead> <tbody> <?php foreach ($arrivalFlights as $flight): ?> <tr> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->iata; ?></td> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->airline->name; ?></td> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->airport->name; ?></td> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->scheduleddate . ' ' . (string)$flight->scheduledtime; ?></td> </tr> <?php endforeach; ?> <?php if (empty($arrivalFlights)): ?> <tr> <td colspan="4" style="border: 1px solid #eee; padding: 8px; text-align: center;">暂无进港航班</td> </tr> <?php endif; ?> </tbody> </table> </div> <!-- 离港航班列 --> <div style="flex: 1; min-width: 300px;"> <h3>离港航班</h3> <table style="width: 100%; border-collapse: collapse;"> <thead> <tr> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">航班号</th> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">航司</th> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">目的地机场</th> <th style="border: 1px solid #eee; padding: 8px; text-align: left;">计划离港时间</th> </tr> </thead> <tbody> <?php foreach ($departureFlights as $flight): ?> <tr> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->iata; ?></td> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->airline->name; ?></td> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->airport->name; ?></td> <td style="border: 1px solid #eee; padding: 8px;"><?php echo (string)$flight->scheduleddate . ' ' . (string)$flight->scheduledtime; ?></td> </tr> <?php endforeach; ?> <?php if (empty($departureFlights)): ?> <tr> <td colspan="4" style="border: 1px solid #eee; padding: 8px; text-align: center;">暂无离港航班</td> </tr> <?php endif; ?> </tbody> </table> </div> </div>
代码说明
- 优先使用XPath方法筛选数据,代码更简洁,性能和手动遍历一致
- 读取SimpleXML节点值时统一用
(string)做强制类型转换,避免返回对象导致的输出异常 - 布局用flex实现响应式两列,移动端会自动堆叠为单列,适配WordPress绝大多数主题
- 内置了空数据判断和XML加载错误捕获,不会出现空白或者报错问题
- 你可以根据自己的需求增删表格字段,或者调整CSS样式匹配站点风格
如果你需要把航班数据做成短代码插入到文章/页面,只需要把上述逻辑包裹在短代码回调函数里,用
add_shortcode注册即可,不需要修改核心逻辑。
内容的提问来源于stack exchange,提问作者Mattias
相关产品推荐
相关产品推荐

