数组迭代中的回显会覆盖以前的回显(PHP)


Echo in an array iteration overwrites previous echo (PHP)

目前我正在做这件事:

$lines = file('data/index');
    foreach ($lines as $value)
    list($title, $location) = explode("|", $value);
    echo '<div id="entry"><a href="'.$location.'">'.$title.'</a></div>';

data/index的内容为:

This is a test post|http://google.com 
Another test post|http://google.com

但是,它只打印出该文件的最后一行。几乎就像每个"回声"都被一个新的回声覆盖一样。我显然做得不对。为什么它不起作用?我如何才能让它按我想要的方式运行?

在代码中,只有第三行是循环的一部分。如果你想让两个语句都在循环中,你必须创建一个块:

foreach ($lines as $value) {
    list($title, $location) = explode("|", $value);
    echo '<div id="entry"><a href="'.$location.'">'.$title.'</a></div>';
}

此外,应该避免使用PHP对HTML进行echo处理。您应该将PHP嵌入到HTML中。它使您的代码,尤其是HTML标记更易于维护,并且不易出错。

参考:foreach

您需要大括号{}。如果没有它们,只有下一行在循环后被迭代。因此,只有您的list((被迭代。

foreach ($lines as $value)
{ // <-- Important
    list($title, $location) = explode("|", $value);
    echo '<div id="entry"><a href="'.$location.'">'.$title.'</a></div>';
} // <-- Important

您有:

foreach ($lines as $value)
list($title, $location) = explode("|", $value);
echo '<div id="entry"><a href="'.$location.'">'.$title.'</a></div>';

foreach循环中只有列表部分。您需要:

foreach ($lines as $value)
{
    list($title, $location) = explode("|", $value);
    echo '<div id="entry"><a href="'.$location.'">'.$title.'</a></div>';
}