使用字符串变量访问嵌套数组或对象变量

时间:2015-04-03 21:30:25

标签: php

我希望能够查找和更改给定对象中可能存在或不存在的特定属性。这些属性是不一致结构化数组的一部分,因此我想提前定义要查找的属性。

$properties = array(
  "color",
  "name['first']",
  "jobs->primary['company']",
  "location['home']['city']",
  etc...
);

foreach ($properties as $property) {
  if (isset($some_object->$property)) {
    ...
  }
}

问题当然是'$ some_object-> $ property',它始终为null。

我假设$ property被视为字符串而不是变量名。一世 只是不记得是否有方法表明它是变量名称的一部分 而不是一个简单的字符串。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您的对象看起来像这样,您的代码将起作用:

$some_object = new stdClass;
$some_object->{"color"} = "brown";
$some_object->{"name['first']"} = "Bob";
$some_object->{"jobs->primary['company']"} = "Google";
$some_object->{"location['home']['city']"} = "Redmond";

如果你的对象是这样的:

$some_object = new stdClass;
$some_object->color = "brown";
$some_object->name = ["first" => "Bob"];
$some_object->jobs = new stdClass;
$some_object->jobs->primary = ["company" => "Google"];
$some_object->location = ["home" => ["city" => "Redmond"]];

然后你的代码将无效。

$properties数组中的值是字符串,而不是对象属性/数组。为了使用$properties值,您需要编写相当多的代码来解析值(“理解”值),然后您需要使用解析的数据递归遍历对象。

递归地移动对象并不是那个很难,但你最好还是找一些其他的方法。

答案 1 :(得分:0)

为此,您可以使用函数property_exists

所以它会是:

foreach ($properties as $property) {
  if (property_exists($object ,$property )) {
    ...
  }
}