如何在PHP/Laravel中获取嵌套数组内set数组的name属性?
解决嵌套数组访问时的「Trying to get property of non-object」错误
嘿,我来帮你搞定这个问题!先把你的数组结构整理得更清晰些,方便理解:
[ "insights" => [ 0 => [ "group" => "Provision", "dataset" => [ 0 => [ "group" => "Provision", "set" => [ 0 => ["name" => "Neutral", "value" => 917], 1 => [...], 2 => [...] ] ] ] ] ], "errorCode" => 0 ]
为啥会报错?
你碰到的「Trying to get property of non-object」错误,十有八九是把数组当成对象来访问了(比如用->符号),但从输出里的array:1、array:3能看出来,你的整个结构全是数组,根本不是对象,用对象的访问方式肯定会报错。
正确的访问姿势
既然全是数组,那全程就得用数组下标[]来访问:
直接拿第一个set的name
假设你的数组存在变量$data里,直接这么写就行:
$firstSetName = $data['insights'][0]['dataset'][0]['set'][0]['name']; echo $firstSetName; // 会输出 "Neutral"
遍历所有set的name(更安全)
如果不确定某一层数组会不会为空(比如接口返回偶尔缺数据),一定要先做存在性判断,不然很容易踩坑:
// 先检查insights是否存在且是数组 if (isset($data['insights']) && is_array($data['insights'])) { foreach ($data['insights'] as $insight) { // 检查dataset层级 if (isset($insight['dataset']) && is_array($insight['dataset'])) { foreach ($insight['dataset'] as $dataset) { // 检查set层级 if (isset($dataset['set']) && is_array($dataset['set'])) { foreach ($dataset['set'] as $item) { // 确保name字段存在再输出 if (isset($item['name'])) { echo $item['name'] . PHP_EOL; } } } } } } }
PHP 7.4+ 用可选链简化代码
如果你的PHP版本是7.4及以上,用**可选链运算符??**能省掉一大堆isset判断,代码会简洁很多:
// 获取第一个set的name,不存在就返回null $firstSetName = $data['insights'][0]['dataset'][0]['set'][0]['name'] ?? null; // 遍历的简化写法 foreach ($data['insights'] ?? [] as $insight) { foreach ($insight['dataset'] ?? [] as $dataset) { foreach ($dataset['set'] ?? [] as $item) { echo $item['name'] ?? '无名称' . PHP_EOL; } } }
避坑提醒
- 别混用
[]和->:你的结构里没有对象(输出里的#209只是PHP数组的内部ID,不是对象),所以全程用数组下标访问。 - 一定要做层级检查:要是某一层数组不存在(比如
insights[0]为空),直接访问会立刻报错,提前判断能避免这种情况。
内容的提问来源于stack exchange,提问作者amnrzm
相关产品推荐
相关产品推荐

