【问题标题】:How to use a loop variable outside the loop?如何在循环外使用循环变量?
【发布时间】:2013-12-03 07:13:18
【问题描述】:

我正在尝试在循环外使用$description 变量。请帮我做。

<?php
$sql_album = "SELECT * FROM albums";

$res_album = mysql_query($sql_album) or die(mysql_error());

$albums = array();

$description = "";

while ($row_album = mysql_fetch_assoc($res_album)) {

    $description = $row_album['description'];

    $albums[$row_album['title']] = array(
        'images/albums/'.$row_album['title'].'/1.jpg',
        'images/albums/'.$row_album['title'].'/2.jpg',
        'images/albums/'.$row_album['title'].'/3.jpg',
        'images/albums/'.$row_album['title'].'/4.jpg'
    );
}

foreach ($albums as $name => $a) {
?>
<div id="album">
    <a href="view_album.php?name=<?php echo $name; ?>" data-images="<?php echo implode('|', array_slice($a,1))?>" class="album">
        <img src="<?php echo $a[0]?>" alt="<?php echo $name?>" />
        <span class="preloader"></span>
    </a>
    <div class="album_info">
        <a href="view_album.php?name=<?php echo $name; ?>"><h4><?php echo $name?></h4></a>
        <p><?php echo $description; ?></p>
    </div>
</div>
<?php
}
?>

我应该先创建一个数组,还是先定义它,我完全糊涂了,需要帮助。

【问题讨论】:

  • 访问$description 对您没有帮助。想想看,它只有while 循环的last 迭代的值。您将无法获取相应图像的值。
  • mysql_* 函数不再维护,不应在任何新代码库中使用。它正在逐步淘汰,以支持更新的 API。相反,您应该将prepared statementsPDOMySQLi 一起使用。

标签: php arrays variables loops while-loop


【解决方案1】:

在您的 $albums 数组中(在 while 循环中),像这样存储您的图像和描述:

$albums[$row_album['title']] = array(
    "description" => $row_album['description'], 
    "images" => array(
        'images/albums/'.$row_album['title'].'/1.jpg',
        'images/albums/'.$row_album['title'].'/2.jpg',
        'images/albums/'.$row_album['title'].'/3.jpg',
        'images/albums/'.$row_album['title'].'/4.jpg'
    )
);

然后在你的 foreach 循环中,像这样操作:

<img src="<?php echo $a['images'][0]?>" alt="<?php echo $name?>" />

<p><?php echo $a['description']; ?></p>

编辑: 不要忘记更改此设置

array_slice($a,1)

到这里:

array_slice($a['images'],1)

【讨论】:

  • 谢谢,它工作得很好。我可能会来这个,但我缺乏逻辑:P
【解决方案2】:

我只是将整个事情组合成一个循环;以下代码未经测试,但我希望你能遵循它。

while ($row_album = mysql_fetch_assoc($res_album)) {
    print_album($row_album);
}

function print_album(array $album)
{
    $name = htmlspecialchars($album['title'], ENT_QUOTES, 'UTF-8');
    $description = htmlspecialchars($album['description'], ENT_QUOTES, 'UTF-8');

    $view_link = sprintf('view_album.php?%s', http_build_query([
        'name' => $album['title'],
    ]);

    $images = array_map(function($index) use ($album) {
        return sprintf(
            'images/albums/%s/%d.jpg',
            urlencode($album['title']),
            $index
        );
    }, range(1, 4));

    $images_data = htmlspecialchars(join('|', array_slice($images, 1)), ENT_QUOTES, 'UTF-8');

?>
<div id="album">
    <a href="<?php echo $view_link ?>" data-images="<?php echo $images_data; ?>" class="album">
        <img src="<?php echo htmlspecialchars($images[0], ENT_QUOTES, 'UTF-8'); ?>" alt="<?php echo $name; ?>" />
        <span class="preloader"></span>
    </a>
    <div class="album_info">
        <a href="<?php echo $view_link; ?>"><h4><?php echo $name; ?></h4></a>
        <p><?php echo $description; ?></p>
    </div>
</div>
<?php
}

我使用urlencode()htmlspecialchars()http_build_query() 添加了转义,以防止您的HTML 出现潜在中断(或者XSS 是最坏的情况)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多