Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在对象上分配迭代属性/变量?_Php_Oop - Fatal编程技术网

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

Php 如何在对象上分配迭代属性/变量?,php,oop,Php,Oop,我试图将数据导出到分析中,但我做错了什么 基本上,我有一个报告,其中包含1到9个主题s。 我从头开始编写这个导出工具,数据来自遗留系统 分析应导出为CSV,列如下: 'report_id';'主题0';'主题1'…一直到“主题9' 我试着对一份报告的一系列主题进行分析,并计算: $iterator=0; foreach ($subjects as $subject) { $this->analysis [$report_id] ->subject${iterator} = (st

我试图将数据导出到分析中,但我做错了什么

基本上,我有一个
报告
,其中包含1到9个
主题
s。 我从头开始编写这个导出工具,数据来自遗留系统

分析应导出为CSV,列如下:

'report_id';'主题0';'主题1'
…一直到
“主题9'

我试着对一份报告的一系列主题进行分析,并计算:

$iterator=0;
foreach ($subjects as $subject)
{
  $this->analysis [$report_id] ->subject${iterator} = (string)$subject;
  $iterator++;
}
更新 因为我可能不会在arrow运算符的右侧使用变量,所以我将其重写为一个非常不干燥的开关:

$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\u id]
是一个存储字符串的对象,如下所示:
$this->analysis[$report\u id]->subject0=“foo”

$report\u id
是先前循环的结果。
$this->analysis
是一个数组,其中填充了分析中包含的(
报告
)对象


我希望任何人都能发现缺陷,并为我指明干涸我的实现的方向。它背后的理念给了我额外的分数,这样我不仅在这个问题上得到了帮助,而且对oop php世界有了更好的理解。

我不知道$report\u 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?
  }
}
使用变量表示变量

文档:-

我不知道$report\u 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?
  }
}
使用变量表示变量

文档:-

根据注释:您需要向对象所在的类添加一个魔术
\u set()
,该类的对象位于
$this->analysis[$report\u 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];        
    }

}
magic 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;
}
理解上述内容的两个基本手册页是:


根据注释:您需要向对象所在的类添加一个神奇的
\u集()
,该类的对象位于
$this->analysis[$report\u 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];        
    }

}
magic 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;
}
理解上述内容的两个基本手册页是:


如果您不告诉我们什么是
$this->analysis[$report\u id]
,就不可能给您一个答案<代码>$this->analysis[$report\u id]->subject${iterator}=$subject非常不规则,但在某些非常特定的情况下它可能是有效的代码。你所说的
是什么意思应用程序是编写过程式的
?需要更多:
$this->analysis[$report\u id]
绝不是
标准对象
。如果它是一个对象,那么它就是实现。或者它可以是一个简单的数组<代码>$this->analysis[$report\u id]->subject0=“foo”这行吗?您可能在代码中看到了它,但您是否验证了它的有效性?这有两种方法:1)在
$this->analysis[$report\u id]
中的对象对每个主题都有公共属性,或者2)它使用魔法设置器。在任何情况下,这都不是标准行为,您必须确定它是有效的。在->之后的
部分不工作是什么意思。
是什么意思?你是否得到了一个错误或者一个通知(你应该在EyALL上看到通知)——或者它不起作用,也就是说没有错误,但是当你检查<代码> $->分析[$RePrimiID] < /代码>它不保存你给它的值?这是一个非常具体的问题,只是把它当作“伪代码”来考虑。。如果你不告诉我们什么是
$this->analysis[$report\u id]
,那么就不可能给出答案<代码>$this->analysis[$report\u id]->subject${iterator}=$subject非常不规则,但在某些非常特定的情况下它可能是有效的代码。你所说的
是什么意思应用程序是编写过程式的
?需要更多:
$this->analysis[$report\u id]
绝不是
标准对象
。如果它是一个对象,那么它就是实现。或者它可以是一个简单的数组<代码>$this->analysis[$report\u id]->subject0=“foo”这行吗?您可能在代码中看到了它,但您是否验证了它的有效性?这有两种方法:1)在
$this->analysis[$report\u id]
中的对象对每个主题都有公共属性,或者2)它使用魔法设置器。在任何情况下,这都不是标准行为,您必须确定它是有效的。在->之后的
部分不工作是什么意思。
是什么意思?你是否得到了一个错误或者一个通知(你应该在EyALL上看到通知)——或者它不起作用,也就是说没有错误,但是当你检查<代码> $->分析[$RePrimiID] < /代码>它不保存你给它的值?这是一个非常具体的问题,只是把它当作“伪代码”来考虑。我不知道我昨天错过了什么,我想我尝试过这种方法,但显然我没有。我不知道我昨天错过了什么,我想我尝试过这种方法,但显然我没有。谢谢你帮我澄清我的问题(与你的h