PHP读取ArcGIS JSON数据报错:Illegal string offset 'features'排查
如何正确读取ArcGIS服务JSON中的features->attributes->GEN字段?
我尝试读取ArcGIS服务返回的JSON文件以获取features中的GEN字段,但执行代码时出现错误:
Warning: Illegal string offset 'features'
返回的数据结构包含objectIdFieldName、fields、features等字段,features数组内的attributes子数组存有GEN、cases、deaths数据。我的PHP代码如下:
$url = "https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=GEN%20%3D%20%27CELLE%27&outFields=GEN,cases,deaths&outSR=4326&f=json"; $json = file_get_contents($url); $data = json_decode($json,true); print '<pre>'; print_r($data); foreach($data as $row){ echo $row['features']->$row['attributes']->$row['GEN']; }
想请教读取逻辑哪里出错,如何正确获取features->attributes->GEN的值?
问题出在这几个关键地方:
- 遍历对象错误:你直接遍历了整个
$data数组,但features本身就是$data里的一个子数组,完全不需要遍历整个$data,应该直接遍历$data['features']。 - 混合数组与对象语法:你用
json_decode($json, true)把JSON转成了关联数组,但后面却误用了对象访问的->语法——既然转成了数组,就全程用数组的['key']方式访问才对。 - 层级路径完全搞反:正确的访问路径是
$data['features'](要素数组)→ 每个要素里的attributes(属性子数组)→GEN字段,你的代码把这个层级完全颠倒了。
修正后的可运行代码:
$url = "https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=GEN%20%3D%20%27CELLE%27&outFields=GEN,cases,deaths&outSR=4326&f=json"; $json = file_get_contents($url); $data = json_decode($json, true); // 先做安全校验,避免空数据或格式错误导致报错 if (isset($data['features']) && is_array($data['features'])) { foreach ($data['features'] as $feature) { // 直接访问attributes里的GEN字段 echo $feature['attributes']['GEN'] . '<br>'; // 如果需要同时输出cases和deaths,可以用下面的写法 // echo "区域:{$feature['attributes']['GEN']},确诊数:{$feature['attributes']['cases']},死亡数:{$feature['attributes']['deaths']}<br>"; } } else { echo "未找到有效features数据或返回格式异常"; }
额外说明:
- 原URL里的
&是HTML转义后的符号,建议改成标准URL的&,避免潜在的解析问题。 - 加入
isset()和is_array()的校验是为了鲁棒性——如果服务返回空数据或格式变化,代码不会直接报错,而是给出友好提示。
内容的提问来源于stack exchange,提问作者Boszor
相关产品推荐
相关产品推荐

