php遍历对象使用变量作为属性名称

时间:2013-09-30 15:22:48

标签: php json object

我有一个案例,我可能会收到两个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;

在我的代码中,我有两个函数来处理每个案例,但除了result vs results[0]之外,它们几乎是理想的,我想将它们组合起来。我试图传递一个变量,但它会抛出错误:

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

给出以下内容:

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

我想知道正确的语法,以及后面的内容,以及关于nominclature的任何指示,因为我担心这个问题标题有点不合适。

3 个答案:

答案 0 :(得分:1)

只是做:

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

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

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

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

答案 1 :(得分:0)

我相信php正在寻找一个名为results[0]的密钥,它不够聪明,知道属性名称是results而你想要集合的第一个成员[0]

答案 2 :(得分:0)

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

$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;