PHP 中正确遍历并输出多维关联数组(如物流轨迹数据)的完整教程

发布时间 - 2026-01-29 00:00:00    点击率:

本文详解如何在 php 中安全、准确地遍历 json 解码后的深层嵌套数组(如 delhivery 物流 api 返回的 shipmentdata),避免“undefined array key”和“foreach on null”等常见错误,并生成结构化 html 表格。

在使用 json_decode($j

son, true) 将 JSON 响应转为 PHP 关联数组后,开发者常因忽略数组层级结构而触发运行时警告——例如本文中的错误:Warning: Undefined array key "Shipment" 和 foreach() argument must be of type array|object, null given。根本原因在于:$item['Shipment']['Scans'] 本身是一个索引数组(含多个 [0] => [...], [1] => [...] 元素),而 ['ScanDetail'] 并非其直接子键,而是每个扫描项内部的键名。原代码错误地将 Scans 视为一个扁平对象,试图用 $item['Shipment']['Scans']['ScanDetail'] 直接访问,导致 PHP 在 Scans 数组上执行非法键查找,最终返回 null,进而使内层 foreach 失败。

✅ 正确做法是逐层解构嵌套结构。以 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 ''; echo ''; echo ''; echo ''; } } echo '
扫描时间操作类型状态说明位置
' . htmlspecialchars($detail['ScanDateTime'] ?? '') . '' . htmlspecialchars($detail['ScanType'] ?? '') . '' . htmlspecialchars($detail['Instructions'] ?? '') . '' . htmlspecialchars($detail['ScannedLocation'] ?? '') . '
'; ?>

? 关键注意事项

  • 永远不要跳过存在性检查:使用 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提高消息队列的实时性方法(推荐)  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法