Лучшая стратегия для преобразования вывода массива в объект? - PullRequest
2 голосов
/ 18 февраля 2010

Я беру вывод массива из программы командной строки и анализирую его в объект 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 ]

1 голос
/ 18 февраля 2010

Поскольку кажется, что вы не можете угадать имя поля по выходу вашей программы, вам придется его где-то определить.

$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;
}
1 голос
/ 18 февраля 2010

Почему бы не поместить код назначения в объект?

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]];
        }
    }
}
1 голос
/ 18 февраля 2010

Я думаю, это должно работать:

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

foreach ($output as $key => $value)
{
    $obj->{'Field' . ($key + 1)} = $value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...