PHP 中正确遍历并输出多维关联数组(如物流轨迹数据)的完整教程
发布时间 - 2026-01-29 00:00:00 点击率:次本文详解如何在 php 中安全、准确地遍历 json 解码后的深层嵌套数组(如 delhivery 物流 api 返回的 shipmentdata),避免“undefined array key”和“foreach on null”等常见错误,并生成结构化 html 表格。
在使用 json_decode($j

✅ 正确做法是逐层解构嵌套结构。以 Delhivery API 的典型响应为例,完整路径为:
$arr['ShipmentData'][0]['Shipment']['Scans'][i]['ScanDetail'][...]
其中 Scans 是一个数字索引数组,每个元素(如 [0], [1])都是一个包含 'ScanDetail' 键的关联数组。
以下是健壮、可落地的解决方案(含空值防护与语义化结构):
&token='); $arr = json_decode($json, true); // 【关键】添加基础校验,防止空响应或结构异常 if (empty($arr) || !isset($arr['ShipmentData']) || !is_array($arr['ShipmentData'])) { echo ' ⚠️ 未获取到有效物流数据,请检查运单号或 Token 是否正确。
'; exit; } $shipments = $arr['ShipmentData']; echo ''; echo '
'; ?>'; echo ''; foreach ($shipments as $shipment) { // 确保 Shipment 存在且为数组 if (!isset($shipment['Shipment']) || !is_array($shipment['Shipment'])) continue; $shipmentData = $shipment['Shipment']; // 确保 Scans 存在且为数组(注意:Scans 是数组,不是对象!) if (!isset($shipmentData['Scans']) || !is_array($shipmentData['Scans'])) continue; // 第一层:遍历 Scans 数组([0], [1], [2]...) foreach ($shipmentData['Scans'] as $scanItem) { // 每个 scanItem 应为 ['ScanDetail' => [...]] 结构 if (!isset($scanItem['ScanDetail']) || !is_array($scanItem['ScanDetail'])) continue; $detail = $scanItem['ScanDetail']; // 输出表格行:安全提取字段,缺失则设为空字符串 echo ' 扫描时间 操作类型 状态说明 位置 '; echo ' '; } } echo '' . htmlspecialchars($detail['ScanDateTime'] ?? '') . ' '; echo '' . htmlspecialchars($detail['ScanType'] ?? '') . ' '; echo '' . htmlspecialchars($detail['Instructions'] ?? '') . ' '; echo '' . htmlspecialchars($detail['ScannedLocation'] ?? '') . ' '; echo '
? 关键注意事项:
- 永远不要跳过存在性检查:使用 isset() + is_array() 双重验证每一级键(尤其是 Shipment、Scans、ScanDetail),这是避免 Undefined array key 的黄金法则;
- 理解数据结构本质:Scans 是数值索引数组([0], [1], ...),而非关联对象,因此必须用 foreach ($scans as $scanItem) 而非 $scans['ScanDetail'];
- 防御式输出:使用 ?? '' 提供默认值,并通过 htmlspecialchars() 防止 XSS;
- 调试技巧:开发阶段可用 var_dump(array_keys($shipmentData)) 或 print_r(array_slice($shipmentData['Scans'], 0, 1)) 快速确认实际键名与结构;
- API 响应容错:真实场景中,Scans 可能为空数组或完全缺失,上述代码已内置兼容逻辑。
通过严格遵循“先验证、再访问、最后渲染”的三层原则,即可稳定解析任意深度的物流、订单或报表类 JSON 数据,并生成清晰、安全的 HTML 表格。
# php
# html
# js
# json
# ai
# lsp
# xss
# Array
# Object
# NULL
# 关联数组
# foreach
# 数据结构
# undefined
# 对象
# 是一个
# 遍历
# 而非
# 都是
# 这是
# 尤其是
# 多个
# 键名
# 设为
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何自定义错误页面(404, 500)?(代码示例)
高端企业智能建站程序:SEO优化与响应式模板定制开发
详解Oracle修改字段类型方法总结
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
js代码实现下拉菜单【推荐】
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
教你用AI将一段旋律扩展成一首完整的曲子
高性价比服务器租赁——企业级配置与24小时运维服务
利用vue写todolist单页应用
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
如何续费美橙建站之星域名及服务?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
浅谈javascript alert和confirm的美化
企业网站制作这些问题要关注
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何在服务器上三步完成建站并提升流量?
如何在IIS中新建站点并配置端口与IP地址?
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
简单实现Android文件上传
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
LinuxShell函数封装方法_脚本复用设计思路【教程】
智能起名网站制作软件有哪些,制作logo的软件?
Laravel如何处理文件下载请求?(Response示例)
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
香港服务器如何优化才能显著提升网站加载速度?
如何快速搭建安全的FTP站点?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
免费网站制作appp,免费制作app哪个平台好?
QQ浏览器网页版登录入口 个人中心在线进入
如何做网站制作流程,*游戏网站怎么搭建?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
长沙企业网站制作哪家好,长沙水业集团官方网站?
C语言设计一个闪闪的圣诞树
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
利用 Google AI 进行 YouTube 视频 SEO 描述优化
如何在VPS电脑上快速搭建网站?
如何在宝塔面板创建新站点?
如何快速搭建高效可靠的建站解决方案?
phpredis提高消息队列的实时性方法(推荐)
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法

