2011-12-05 77 views
1

我想將數據導出到分析中,但我做錯了什麼。如何在對象上分配迭代屬性/變量?

基本上我有一個report有1和9 subject s。 我從頭開始編寫這個導出工具,數據來自遺留系統。

分析應導出爲CSV,與像列:

'report_id';'subject0';'subject1' ...一路'subject9'

我試圖foreach -ing上的報告主體的陣列,並保持數:

$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

如果你不告訴我們'$ this-> analysis [$ report_id]'是什麼,那麼給你一個答案是不可能的。 '$ this-> analysis [$ report_id] - > subject $ {iterator} = $ subject;'是非常不規則的,但它在某些特定情況下可能是有效的代碼。你認爲'申請書寫程序式'是什麼意思? – yannis

+0

需要更多:'$ this-> analysis [$ report_id]'絕不是'標準對象'。如果它是一個對象,那麼它就是實現[ArrayAccess接口](http://www.php.net/manual/en/class.arrayaccess.php)的對象。或者它可能是一個簡單的數組。 '$ this->分析[$ report_id] - > subject0 =「foo」'這是否工作?您可能會在代碼中看到它,但是您是否驗證了它的工作原理?有兩種方法可以解決這個問題:1)'$ this-> analysis [$ report_id]'中的對象具有每個主題的公共屬性,或者2)它使用魔術設置器。 – yannis

+0

在任何情況下,這不是標準的行爲,你必須確定它的工作原理。 「 - 之後的部分不起作用。」是什麼意思?你是否收到錯誤或通知(你應該在E_ALL上有[error_reporting](http://php.net/manual/en/function.error-reporting.php)來查看通知) - 或者它只是不起作用,即沒有錯誤,但當你檢查'$ this-> analysis [$ report_id]'時,它只是不包含你給它的值? – yannis

回答

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? 
    } 
} 

化妝用變量來表示可變的變量
文檔: - http://php.net/manual/en/language.variables.variable.php

+0

我還沒有弄清楚什麼我昨天錯過了,我以爲我嘗試了這種方法,但顯然我沒有。 – seaao

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];   
    } 

} 

魔二傳手的組合和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; 
} 

的兩個基本手冊,來理解上述是:

+0

感謝您幫我清理我的問題(對您有幫助的評論)並向我解釋重載。有很多東西需要學習! – seaao