PHP遍历CURL获取的JSON物流数据 无法读取events字段如何处理
问题根源
- 遍历逻辑和数据结构完全错位:
$data['data']是单个运单的完整数据对象,不是多运单组成的列表数组,直接对它做foreach会逐个遍历它的顶层属性(awbNo、carrierName、allData、events),根本不是你预期的「遍历每条运单」的效果 events是二维数组(每个元素对应一条物流轨迹),PHP不能直接echo输出数组,会触发「Array to string conversion」错误,完全打不出轨迹内容- 漏处理了嵌套在
allData里的运单核心字段,比如预计送达时间、更新时间、是否取消等信息
修正后可直接运行的代码
代码做了单/多运单结构兼容,不管接口返回单个运单还是多个运单的列表都能正常渲染:
<?php // 自动判断返回的data结构,兼容单运单/多运单列表场景 $waybillList = isset($data['data'][0]) ? $data['data'] : [$data['data']]; ?> <table> <?php foreach ($waybillList as $row) { ?> <tr> <!-- 运单基础信息区 --> <td> <div>运单号:<?php echo htmlspecialchars($row['awbNo'] ?? '-'); ?></div> <div>承运商:<?php echo htmlspecialchars($row['carrierName'] ?? '-'); ?></div> <?php $extra = $row['allData'] ?? []; ?> <div>是否取消:<?php echo !empty($extra['cancelled']) ? '是' : '否'; ?></div> <div> 预计送达时间: <?php echo !empty($extra['expectedDeliveryDate']) ? date('Y-m-d H:i', strtotime($extra['expectedDeliveryDate'])) : '-'; ?> </div> <div> 最后更新时间: <?php echo !empty($extra['updated']) ? date('Y-m-d H:i', strtotime($extra['updated'])) : '-'; ?> </div> </td> <!-- 物流轨迹区:单独循环遍历events数组 --> <td> <?php if (!empty($row['events'])) { ?> <ul style="margin:0;padding-left:16px;"> <?php foreach ($row['events'] as $track) { ?> <li> <div>时间:<?php echo date('Y-m-d H:i', strtotime($track['Time'])); ?></div> <div>地点:<?php echo htmlspecialchars($track['Location'] ?? '未知地点'); ?></div> <div>状态:<?php echo htmlspecialchars($track['Remarks'] ?? '无备注'); ?></div> <hr style="margin:4px 0;"> </li> <?php } ?> </ul> <?php } else { echo '暂无物流轨迹信息'; } ?> </td> </tr> <?php } ?> </table>
关键调整说明
- 加了结构兼容判断:自动识别单运单/多运单列表格式,避免遍历错位
- 嵌套数组单独循环:对
events二维数组逐行遍历,把每条轨迹的时间、地点、备注单独渲染,解决数组无法直接echo的问题 - 空值兜底:所有可能为null的字段(比如轨迹里的Location)都加了默认值,避免输出空报错
- 时间格式转换:把接口返回的ISO格式时间转成国内常规可读的
年-月-日 时:分格式 - 信息补全:把嵌套在
allData里的预计送达、取消状态、更新时间等核心运单字段全部提取输出 - 加了
htmlspecialchars转义:避免接口返回的特殊字符打乱页面HTML结构
内容的提问来源于stack exchange,提问作者Ganzu
相关产品推荐
相关产品推荐

