【问题标题】:php traverse object using variables for property namesphp使用属性名称的变量遍历对象
【发布时间】:2013-09-30 15:22:47
【问题描述】:

我有一个案例,我可以接收两个 json 对象之一,在这种情况下,来自 google geocode api 或 places api。

从地理编码 api 访问值将如下所示:

$coordinates            = $data->results[0]->geometry->location;
$cache_value['lat'] = (string) $coordinates->lat;
$cache_value['lng'] = (string) $coordinates->lng;

和几乎相同的地方结构。

$coordinates            = $data->result->geometry->location;
$cache_value['lat'] = (string) $coordinates->lat;
$cache_value['lng'] = (string) $coordinates->lng;

在我的代码中,我有两个函数来处理每种情况,但除了 resultresults[0] 之外,它们几乎相同,我想将它们结合起来。我试图传递一个变量,但它会引发错误:

$result         = ($place) ? 'result' : 'results[0]';
$coordinates    = $data->$result->geometry->location;

给出以下内容:

通知: Undefined property: stdClass::$result[0]

我想知道正确的语法来实现我所追求的,以及关于命名法的任何指针,因为我担心这个问题的标题有点不准确。

【问题讨论】:

  • 'results[0]; 上缺少的引用是错字吗?
  • 为什么不只是 $result = ($place) ? $data->result : $data->results[0];然后 $coordinates = $result->geometry->location;
  • @RUJordan,是的,现在已经更正了 - 谢谢
  • @stakolee - 这是一个很好的观点,我会仔细研究那个。
  • @stakolee - 顺便说一句,很好的密西西比州约翰受伤了/那里混为一谈!

标签: php json object


【解决方案1】:

只要做:

$result         = $place ? $data->result : $data->results[0];
$coordinates    = $result->geometry->location;

您的代码在做什么,是这样的:它尝试使用results[0]名称 解析$data 对象的属性,但没有;再一次 - 它不解析results 属性的0 索引,但它尝试查找具有文字名称results[0] 的属性;如果您的对象看起来像这样,它会起作用:

$obj = (object)array( 'results[0]' => 'hey there' );

如果出于任何原因您想使用它,您可以创建一个像这样的愚蠢属性:$data->{'results[0]'} = 5; - 但它很愚蠢,不要这样做:)

【讨论】:

  • +1 以获得关于发生了什么的额外解释。
【解决方案2】:

我相信 php 正在寻找一个名为 results[0] 的键,它不够聪明,无法知道属性名称是 results 并且您想要集合的第一个成员 [0]

【讨论】:

    【解决方案3】:

    问题在于变量名的引用,而不是它的值。

    $result = ($place) ? 'result' : 'results[0]';
    $coordinates = $data->$result->geometry->location; 
    

    $result 只是一个字符串,应该是$data->result$data->result[0] 的实际值。

    要更正它,只需使用$result 保存结果的值。

    $result = ($place) ? $data->result : $data->results[0];
    $coordinates = $result->geometry->location; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-24
      • 2011-11-29
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多