Foreach循环仅占用最后一个值

时间:2013-03-01 02:53:12

标签: php

我是PHP的新手,我没有什么问题。我有这样的代码:

$file = $_FILES['sel_file']['name'];

$chk_ext = explode(".",$file);

if(strtolower($chk_ext[1]) == "txt")
{

    $filename = $_FILES['sel_file']['tmp_name'];
    $handle = fopen($filename, "r");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
    {
        $array = array( $data[0]);
        foreach( $array as $value )
        {
            $number=$value;
        }

        $obj=new Sender("$number");
    }

    header("location:bulk.php?msg=send");
}
else
{
    header("location:bulk.php?invalid=file");
    exit();

}
$obj->Submit ();

问题是$obj=new Sender("$number");中只有最后一个值来自文本文件,请帮帮我。

4 个答案:

答案 0 :(得分:2)

fgetcsv()已经返回一个数组,因此:$array = array( $data[0]);只表示你只检索$ data的字段数组的第一个元素。 在foreach循环中,您应该用$ data替换$ array变量。 然后循环看起来像这样:

foreach( $data as $value )
    {
        $number=$value;
    }

    $obj=new Sender("$number");

表示对于$ data中的每个元素,将其保存在$ number内,再次循环并再次将其放入$ number覆盖它。 在foreach循环之后,$ number的值将是该行的最后一个字段。

您应该将行$obj=new Sender("$number");放在循环中,以便每行的每个元素都放在Sender中。

答案 1 :(得分:1)

毫不奇怪。循环遍历所有值,使用最近检索的值不断覆盖$number。当循环退出时,最终只有最后一个循环。

可能你想要更像的东西:

foreach($array as $value) {
   $obj = new Sender($value);
}

你的代码也没什么意义。您获取上传的文件,可能是CSV,从中读取一行,从该行中提取FIRST值。将值强制转换为数组,然后读回数组中的ONE值(数组中的 ONLY 值),并对其执行某些操作。

即使你的foreach没有覆盖该值,你仍然只有一个值可以循环。

答案 2 :(得分:0)

这是因为您在每次迭代中为$number分配了一个新值。您需要附加到该变量($number .= $value) or you need to add it to an array ( $ number [] = $ value)。

答案 3 :(得分:0)

每次迭代都会覆盖数字的内容。您可以使数字成为一个数组,用于将每个值存储在递增元素中。

foreach( $array as $value )
 {
   $number[]=$value;
 }

$obj=new Sender($number);