【问题标题】:Best strategy to convert array output to an object?将数组输出转换为对象的最佳策略?
【发布时间】:2010-02-19 01:39:47
【问题描述】:

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

这有点麻烦,尤其是当字段数增加时。有没有更好的设计模式或方法来以不那么笨拙的方式完成同样的壮举?

【问题讨论】:

    标签: php architecture


    【解决方案1】:

    为什么不把赋值代码放在对象里面呢?

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

    或者使用get魔法方法。

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

    【讨论】:

    • 谢谢,我不知道魔术方法 __get/__set。这与字段名称的数组映射一起是一个很好的解决方案。
    【解决方案2】:

    我想这应该可行:

    $output = explode("\n", shell_exec(myProg));
    $obj = new MyObject();
    
    foreach ($output as $key => $value)
    {
        $obj->{'Field' . ($key + 1)} = $value;
    }
    

    【讨论】:

    • 我的小例子对此并不清楚,但字段名称通常比 Field1/Field2 更有意义。我正在寻找一种更优雅的方式来处理字段映射,而不是一堆用于偏移量和手动分配的常量。
    • @timbonicus:那么也许您应该尝试更好地解释您要归档的内容,因为我仍然不明白。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多