我正在尝试在上传后导入制表符分隔的文件。这主要是通过以下函数完成的。我正在尝试构建一个类实例数组。代码如下:
导入功能
$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]
仅影响当前迭代。
除了其他人所说的之外,您似乎每次都尝试将属性数据插入到同一对象,因为您没有在循环中创建任何新的产品导入实例。