如何在对象上分配迭代属性/变量?

时间:2011-12-05 11:17:32

标签: php oop

我正在尝试将数据导出到分析中但我做错了。

基本上我的report介于1到9 subject之间。 我从头开始编写这个导出工具,数据来自遗留系统。

分析应导出为CSV,其中包含以下列:

'report_id';'subject0';'subject1' ...一直到'subject9'

我尝试foreach - 报告的一系列主题,并保持计数:

$iterator=0;
foreach ($subjects as $subject)
{
  $this->analysis [$report_id] ->subject${iterator} = (string)$subject;
  $iterator++;
}

更新 因为我可能不会在箭头操作符的右侧使用变量,所以我将其重写为非DRY开关:

$iterator = 0;
foreach ($categories as $subject)
  {
    switch ($iterator)
    {
    case 0:
      $this->analysis [$report_id] ->subject0 =  $subject;
      break;
    case 1:
      $this->analysis [$report_id] ->subject1 =  $subject;
      break;
    case 2:
      $this->analysis [$report_id] ->subject2 =  $subject;
      break;
    // I have 6 more cases, just to fill all 9 subjects, snipped for brevity

    default:
      //some errorhandling //snipped for brevity
      break 2;
    } 
    $iterator++;
  } 

$this->analysis [$report_id]是一个存储字符串的对象,如下所示:
$this->analysis [$report_id] ->subject0 = "foo"
$report_id是早期循环的结果 $this->analysis是一个数组,其中包含分析中包含的(report)个对象。

我希望任何人都能找到这个漏洞,并指出我在干预我的实施方向。它背后的哲学的奖励点,所以我不仅帮助解决了这个问题,而且更好地理解了oop-php世界。

2 个答案:

答案 0 :(得分:1)

我不知道$ report_id来自哪里......
通常,我会这样做: -

$iterator = $i = 0;
foreach ($categories as $subject)
{
  $var = "subject{$i}";
  $this->analysis [$report_id]->$var =  $subject;
  ++$i;
  if ($i >= 10)
  {
    // what is your error?
  }
}

利用变量来表示变量
docs: - http://php.net/manual/en/language.variables.variable.php

答案 1 :(得分:0)

根据评论:您需要向对象位于__set()的类添加魔法$this->analysis [$report_id]。为方便起见,我们调用类HelloWorld。您的代码将类似于:

class HelloWorld {

    private $data = array();

    public function __set($key, $value) {
        $this->data[$key] = $value;        
    }

    public function __get($key) {
        if( !array_key_exists($key, $this->data) ) {
            return null; // or throw an exception
        }

        return $this->data[$key];        
    }

}

魔术setter和getter的组合实质上通过属性重载提供动态类属性。所以现在你可以这样做:

$foo = new HelloWorld()
$foo->bar = "foobar";
echo $foo->bar;

凡" foobar"存储在HelloWorld::$data数组中,密钥为bar。当然现在这个:

$iterator=0;
foreach ($subjects as $subject) {
    $property = "subject{$iterator}";

    $this->analysis[$report_id]->$property = $subject;
    $iterator++;
}

应该可以正常工作。如果$subjects数组的键是有序整数,您也可以重写为:

foreach ($subjects as $iterator => $subject) {
    $property = "subject{$iterator}";

    $this->analysis[$report_id]->$property = $subject;
}

理解上述内容的两个基本手册是: