将数组输出转换为对象的最佳策略?

时间:2010-02-18 16:27:38

标签: php architecture

我从命令行程序获取数组输出并将其解析为PHP对象。考虑这个实例的一个非常简单的方法示例:

$output = explode("\n", shell_exec(myProg));
$obj = new MyObject();

$offset_field1 = 0;
$offset_field2 = 1;

$obj->Field1 = $output[$offset_field1];
$obj->Field2 = $output[$offset_field2];

这有点麻烦,特别是当字段数增加时。是否有更好的设计模式或方法以较轻的方式完成同样的壮举?

3 个答案:

答案 0 :(得分:1)

我想这应该有效:

$output = explode("\n", shell_exec(myProg));
$obj = new MyObject();

foreach ($output as $key => $value)
{
    $obj->{'Field' . ($key + 1)} = $value;
}

答案 1 :(得分:1)

由于您似乎无法从程序的输出中猜出字段名称,因此您必须在某处定义它。

$key_map = array('field_name1', 'field_name2', 'etc');

$obj = new MyObject();

foreach(explode("\n", shell_exec(myProg)) as $k => $v)
{
  if(isset($key_map($k))
    $obj->$key_map[$k] = $v;
}

答案 2 :(得分:1)

为什么不将赋值代码放在对象中?

class MyObject
{
    public function __construct(array $data)
    {
        $this->Field1 = $data['keyname1'];
        $this->Field2 = $data['keyname2'];
        ...
    }
}

或使用get magic方法。

class MyObject
{
    protected $data;

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

    public function __get($key)
    {
        $map = array('Field1' => 1, 'Feild2' => 2, ...);
        if (isset($map[$key])) {
            return $this->data[$map[$key]];
        }
    }
}