2011-05-16 131 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