我正在尝试将数据导出到分析中但我做错了。
基本上我的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世界。
答案 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;
}
理解上述内容的两个基本手册是: