虽然foreach echo两次?

时间:2013-04-20 14:51:49

标签: php foreach while-loop

只是处理foreach循环。对于每一行,我在$ array中设置'vine'和'mp4'但是当我回显这些值时,它们会发布两次。这是我的代码:

$sql="SELECT vine_id,mp4_url FROM videos LIMIT 1";

$res=mysql_query($sql);

while($row=mysql_fetch_assoc($res)){
    foreach ($row as $array) {
        $array=array(
            "vine"=>$row['vine_id'],
            "mp4"=>$row['mp4_url']);
            echo $array["vine"];
            echo $array["mp4"];
     }
}

这是我的输出:

bUjdjmFHt5I //vine
https://vines.s3.amazonaws.com/v/videos/2013/04/20/A42066A1-EC83-4211-BA20-DAD287C8AF1E-362-0000002797BBAC52_1.0.7.mp4?versionId=oMGICGs2c7dCbodVIHHiaQ1MhqKg65.y //mp4

bUjdjmFHt5I //vine
https://vines.s3.amazonaws.com/v/videos/2013/04/20/A42066A1-EC83-4211-BA20-DAD287C8AF1E-362-0000002797BBAC52_1.0.7.mp4?versionId=oMGICGs2c7dCbodVIHHiaQ1MhqKg65.y //mp4

我在代码中遗漏了两次这个帖子的内容吗?

2 个答案:

答案 0 :(得分:7)

你要循环两次。试试这个:

$sql="SELECT vine_id,mp4_url FROM videos LIMIT 1";

$res=mysql_query($sql);

while($row=mysql_fetch_assoc($res)){
    $array = array(
        "vine" => $row['vine_id'],
        "mp4" => $row['mp4_url'],
    );
    echo $array["vine"];
    echo $array["mp4"];
}

答案 1 :(得分:3)

是的,您正在循环遍历代码中立即销毁的数组:

$sql="SELECT vine_id,mp4_url FROM videos LIMIT 1";

$res=mysql_query($sql);

假设一切顺利,你开始使用$ res指向一个只提供一个结果集的mysql资源。

while($row=mysql_fetch_assoc($res)){

您正在获取此结果集。 $ row现在是一个包含两个键vine_id和mp4_url的数组。

    foreach ($row as $array) {

现在,您将两个键值分配给$ array,一个接一个。你有两个键,这个循环将运行两次。

        $array=array(
            "vine"=>$row['vine_id'],
            "mp4"=>$row['mp4_url']);

现在,您将销毁由foreach分配的值,并使用$ row中的值覆盖它。

您实际上只创建了一个具有略微不同的键名的数组副本。

        echo $array["vine"];
        echo $array["mp4"];

循环运行两次,回声发生两次,内容相同。

     }
}

你真正想要的是什么:

// Use alias in SQL to get the array keys you want
$sql="SELECT vine_id as vine, mp4_url as mp4 FROM videos LIMIT 1";

$res=mysql_query($sql);

// assign the SQL result to a variable of your choice.
while($array=mysql_fetch_assoc($res)){
    // No need to copy the array
    echo $array["vine"];
    echo $array["mp4"];
}