为什么这个PHP代码不输出属性值


Why does this PHP code not output property values?

我正在尝试在上传后导入制表符分隔的文件。这主要是通过以下函数完成的。我正在尝试构建一个类实例数组。代码如下:

导入功能

$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 函数回显 $cells[$i] 的正确值,这些值与我在数组输出中缺少的值相同。

问题似乎是值未分配给属性或未读取属性。我不确定为什么会是这种情况,但我认为这是因为 PHP 不是我的主要语言,而且 foreach 循环可能很明显;)

我正在使用 PHP v5.2.6

这段代码有什么问题?

答:

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

我认为问题出在本节中:

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 手册,Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself.这样你分配的值在循环后被丢弃。

编辑:除此之外,您正在循环访问对象属性,尽管手册没有明确说明它,但似乎您需要foreach($class as $key => $value)而不仅仅是foreach($class as $value)

在 foreach 循环中,赋值的变量(如 $ProductProperty)不是引用,因此它们实际上不会影响循环外的任何内容。

$ProductProperty = $cells[$i]仅影响当前迭代。

除了其他人所说的之外,您似乎每次都尝试将属性数据插入到同一对象,因为您没有在循环中创建任何新的产品导入实例。