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