2011-05-16 50 views
1

我想上傳後導入製表符分隔的文件。這種肉用以下功能完成。我試圖構建一個類的實例數組。代碼如下:爲什麼這個PHP代碼不能輸出屬性值?

導入功能

$AddedProducts; 
function importList($filename) 
{ 
    global $AddedProducts; 
    $AddedProducts=array(); 
    $fileHandle = fopen($filename, "r"); 
    $currentProduct = new productImport(); 

     $line=fgets($fileHandle); $line=fgets($fileHandle); //throw away top 2 lines 
    echo '<hr>'; 
    while(true) 
    { 
     $line = fgets($fileHandle); 
     if($line == null) break; 

     $cells=explode(' ', $line); 
     $i=0; 

     foreach($currentProduct as $ProductProperty) 
     { 
      if(isset($cells[$i])) 
      { 
       $ProductProperty = $cells[$i]; 
       echo $i . '. ' . $cells[$i] . "<br>"; 
      } 
      else return false; 
      $i++; 
     } 
     echo "<hr>"; 
     $AddedProducts[]=$currentProduct; 
    } 
    fclose($fileHandle); 
    return true; 
} 

陣列輸出擊穿

<? 
$i=0; 
foreach($AddedProducts as $AddedProduct) 
{ 
    $i++; 
    echo "<hr>" . $i . "<br>"; 
    foreach($AddedProduct as $key=>$value) 
    { 
     echo $key . ' = ' . $value . '<br>'; 
    } 
} 
?> 

已知信息

  • 最終的數組長度/大小是正確的。 (應在文件中的行 - 2)

  • 它並不需要特別關心有多少屬性是在productImport類,只要它等同於相同數量的每行選項卡中的文件被讀出。

  • importList功能$細胞[$ i]於其是我缺少在陣列輸出的相同值回聲適當的值。

該問題似乎是要麼值沒有被分配給屬性或屬性不被讀取。我不知道爲什麼要麼會出現這種情況,但我認爲這是因爲PHP是不是我的第一語言,而且很可能一些明顯有關foreach循環;)

我使用PHP v5.2.6

這段代碼有什麼問題?

答:

foreach($currentProduct as $ProductProperty) becomes 
foreach($currentProduct as &$ProductProperty) 
+0

請將答案作爲下面的答案發布,而不是在您的問題中。你也可以接受它。 – hakre 2012-12-20 20:15:50

回答

1

我認爲這個問題是在本節:

foreach($currentProduct as $ProductProperty) 
     { 
      if(isset($cells[$i])) 
      { 
       $ProductProperty = $cells[$i];  /* this seems to be the problem */ 
       echo $i . '. ' . $cells[$i] . "<br>"; 
      } 
      else return false; 
      $i++; 
     } 

按照php manualUnless the array is referenced, foreach operates on a copy of the specified array and not the array itself.所以你指定的值在循環後丟棄。

編輯:從除此之外,您是通過對象屬性循環,雖然the manual沒有明確說明它,看來你需要,而不是foreach($class as $key => $value)只是foreach($class as $value)

+0

你和Lotus Notes有基本相同的答案,但你有一些代碼和手冊的鏈接,所以我會標記這一個。僅供參考,我實際上並不需要$ key => $值。謝謝 – 2011-05-16 23:42:51

+0

@Garet Claborn感謝您的更新。 – jeroen 2011-05-16 23:44:02

1

在你的foreach循環,分配的變量,如$ProductProperty沒有引用,因此他們並不會影響環路以外的任何東西。

$ProductProperty = $cells[$i]隻影響當前的迭代。

0

除了別人在說什麼,它似乎你每次都試圖向同一個對象插入屬性數據,因爲你沒有在循環中創建任何新的productImport實例。

+0

實例「創建」發生在'$ AddedProducts [] = $ currentProduct;' – 2011-05-16 23:26:45

+0

呃,從技術上講,這只是一個副本。但我現在明白了。有沒有這樣的PHP公約來做到這一點?在我看來,如果你要在每個循環中明確地創建一個新的實例,閱讀代碼會容易得多。 – vichle 2011-05-17 07:52:34

+0

不知道我明白。你的意思是在循環開始處'$ AddedProducts [] = new productImport();'然後調用$ AddedProducts [$ i]或類似的函數?我只是給函數的範圍一個實例來準備所有的值,然後發送它們。我想如果有什麼是C++的慣例,那麼PHP並不是我的強項。 – 2011-05-17 10:58:48

相關問題