2010-02-18 68 views
2

我正在从命令行程序获取数组输出并将其解析为一个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]; 

这有点麻烦,特别是当字段数量增加时。有没有更好的设计模式或方法以较轻的手段完成相同的技艺?

回答

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]]; 
     } 
    } 
} 
+0

谢谢,我没有意识到__get/__设置的魔术方法。这与字段名称的数组映射是一个很好的解决方案。 – timbonicus 2010-02-18 17:47:07

1

我想这应该工作:

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

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

我的小例子并不清楚,但字段名称通常比Field1/Field2更有意义。我正在寻找一种更优雅的方式来处理字段映射,而不是一堆用于偏移量和手动赋值的常量。 – timbonicus 2010-02-18 16:43:29

+0

@timbonicus:那么也许你应该尝试解释你想要更好一点的归档,因为我仍然没有得到它。 – 2010-02-18 17:36:43

1

,因为它似乎你不能从你的PROGRAMM的outpout猜字段名,你就必须从某个地方定义它。

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