
本文详解如何在 php 中遍历含嵌套对象与数组的复杂数据结构(如 cpanel api 返回结果),重点解决因混淆对象属性访问与数组索引导致的 “trying to get property of non-object” 错误。
本文详解如何在 php 中遍历含嵌套对象与数组的复杂数据结构(如 cpanel api 返回结果),重点解决因混淆对象属性访问与数组索引导致的 “trying to get property of non-object” 错误。
在处理 cPanel、WHM 或其他 API 返回的 JSON 解析结果时,PHP 通常会将其转换为 stdClass 对象嵌套数组的混合结构。如题中所示,$value->userlist 是一个索引数组(array(1)),而非对象,因此不能用 ->user 直接访问——这正是报错 Trying to get property 'user' of non-object 的根本原因。
正确做法是:先通过数组下标(如 [0])获取数组中的第一个元素(该元素本身是 stdClass 对象),再使用对象操作符 -> 访问其属性:
<?php foreach ($result->cpanelresult->data as $value): ?>
<b>DB Name:</b> <?php echo htmlspecialchars($value->db); ?> |
<b>Size:</b> <?php echo htmlspecialchars($value->size); ?> |
<b>User:</b> <?php echo htmlspecialchars($value->userlist[0]->user); ?>
<br><?php endforeach; ?>
⚠️ 注意事项:
-
务必校验数组长度:userlist 可能为空或包含多个用户(如权限分配场景)。安全写法应为:
<?php if (!empty($value->userlist) && isset($value->userlist[0]->user)): ?> <b>User:</b> <?php echo htmlspecialchars($value->userlist[0]->user); ?> <?php else: ?><b>User:</b> — <?php endif; ?> - 防止 XSS 攻击:对输出到 HTML 的变量始终使用 htmlspecialchars() 转义。
- 调试技巧:遇到访问异常时,优先用 var_dump(gettype($value->userlist)) 和 print_r($value->userlist) 确认数据类型与结构,避免凭空猜测。
-
扩展性考虑:若需遍历全部用户(如一个数据库绑定多个账号),应嵌套循环:
<?php foreach ($value->userlist as $userObj): ?> User: <?php echo htmlspecialchars($userObj->user); ?><br><?php endforeach; ?>
总结:PHP 中混合结构的访问关键在于分清层级的数据类型——是对象(用 ->)还是数组(用 [index])。多一层 var_dump,少十行错误;多一次类型判断,多十分健壮性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











