如何获取stdClass Object中distance的value值?代码异常求解
首先看你给出的var_dump结构,这是Google Maps Distance Matrix API的典型返回结构,先明确核心数据层级:
object(stdClass)#35 (4) { ["destination_addresses"]=> array(1) { ... } ["origin_addresses"]=> array(1) { ... } ["rows"]=> array(1) { [0]=> object(stdClass)#36 (1) { ["elements"]=> array(1) { [0]=> object(stdClass)#37 (3) { ["distance"]=> object(stdClass)#38 (2) { ["text"]=> string(7) "25.2 km" ["value"]=> int(25195) // 这就是你要的目标值 } ... } } } } ["status"]=> string(2) "OK" }
先分析你三种方法的问题:
遍历对象赋值无输出
你的foreach($distancedecoded as $route)是遍历顶层的4个属性(destination_addresses、origin_addresses、rows、status),$route会依次是数组、数组、对象、字符串。只有当$route指向rows时,它本身还是数组,不是直接带elements属性的对象,所以$route->elements根本不存在,循环里的赋值完全无效。直接索引取值无效
首先$route这个变量你根本没定义过;其次就算用原对象$distancedecoded,rows是索引为0的数组,不是索引2,$distancedecoded->rows[2]本身就不存在,自然取不到值。转为数组遍历出现非法字符串偏移
转为数组后,foreach($distancedecoded as $route)还是遍历顶层的四个键值对,比如第一次循环$route是destination_addresses对应的数组(只有索引0的元素),你直接取$route[2]就会触发非法偏移警告——这个数组根本没有索引2的元素,后续的['elements']等自然也都是错误的。
正确的取值方法
根据数据层级,我们需要逐层定位到目标值,分两种常用方式:
方式1:直接使用对象访问(不转数组)
// 假设$distancedecoded是你var_dump里的原对象 $distanceValue = $distancedecoded->rows[0]->elements[0]->distance->value; echo $distanceValue; // 输出:25195
逻辑拆解:
$distancedecoded->rows是包含1个元素的数组,取第一个元素[0]- 这个元素是包含
elements属性的对象,elements也是包含1个元素的数组,取第一个元素[0] - 最后访问这个元素的
distance对象,取它的value属性
方式2:转为数组后访问
如果你习惯用数组操作,转为数组后按照数组层级取值:
$distancedecoded = json_decode($getdistance, true); // 第二个参数传true转为关联数组 $distanceValue = $distancedecoded['rows'][0]['elements'][0]['distance']['value']; echo $distanceValue; // 输出:25195
逻辑和对象访问完全一致,只是把->换成数组的[]访问方式。
如果担心数据可能有多个rows或elements(比如多起点/终点场景),可以加一层循环遍历所有可能的结果:
// 对象方式遍历所有有效distance value foreach($distancedecoded->rows as $row) { foreach($row->elements as $element) { if($element->status === 'OK') { // 确保该段路线请求成功 echo $element->distance->value . '<br>'; } } }
内容的提问来源于stack exchange,提问作者twan

