PHP如何将路径拆分为对象属性

时间:2018-06-02 23:14:02

标签: php

我有数据来源,它就像:

$sourceData = json_decode($sourceData);

OR

$sourceData = simplexml_load_string($sourceData);       

但可能它可能是另一种类型的源,结果可能是php对象,带有这样的属性路径:

$sourceData->product->time[$x]->location->precipitation['value'];

我想分开这样的路径:

$rootPath = $sourceData->product->time[$x];
$rest = ? 
/* probably something like '{$location}->{$precipitation}['value'] 
but I want the rest in one variable like 
$rest = 'location->precipitation['value'];
*/

所以最后我应该加载类似或类似的路径:

$temperature = 'location->data->something->temperature['value'];'
$precipitation = 'location->xxx->yyy->precip['data'];'

并使用如:

for($i)
{
   $temp = $root[$i]->temperature;
   $precip = $root[$i]->precipitation;
}

1 个答案:

答案 0 :(得分:0)

这可以通过动态路径(如“点符号”)完成,但我会推迟它,并确保我真的需要它。它可能很慢,并且在更通用的情况下使用 - 客户端将提供的未知变量路径。

更清洁的方法是将每个根子树($data->product->time)封装在对象中,使用可以深入内部并返回所需内容的方法。例如:

class ProductProperties
{
    private $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function temperature()
    {
        return $this->data->location->something->temperature['value'];
    }

    //...
}

然后创建实例并在循环(或单独的循环)中调用它:

foreach ($sourceData as $root) {
    $properties = new ProductProperties($root);
    $temp = $properties->temperature();
}