在foreach循环期间将查询结果插入到php字符串中

时间:2013-09-30 13:59:09

标签: php mysql foreach

我有一个php foreach循环列出从MySQL中提取的新闻故事,作为循环的一部分,故事被打印出来然后在查询下面运行拉,然后显示附加到故事的任何图像。这是它的简化版本:

foreach ($res AS $row) { 
    printf('<p>%s</p>' . PHP_EOL, nl2br($row['story']));


    $qry3 = "select * from tpf_images where news_id=".$row['news_id'];
    $res3 = $pdo->query($qry3);


    foreach ($res3 AS $row3) { 

        printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
        <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );
    }
}

它运作正常,但意味着新闻故事的所有图像都在这个故事之下。我想要实现的是,在每个段落的开头,图像作为故事文本的一部分打印出来。该故事使用nl2br($row['story'])打印出来,使用nl2br段落即可实现 <br /><br />。那么有没有办法让PHP扫描nl2br($row['story']),如果它找到<br /><br />,则插入我用于图像foreach的文本:

printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
<img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );

这样,图像将显示在文本正文中,而不是在文本正文下方。如果结果中的图像数量超过<br /><br />,则其他图像会像以前一样打印出来。

感谢您对此的任何帮助,因为我完全被难倒(同样,不确定标题应该是什么,以便可以根据需要进行编辑以更好地适应)

编辑:尝试让问题更清晰,nl2br($row['story'])搜索<br /><br />。如果发现它被替换为<br /><image><br />,其中image是我用来显示图像的代码:

<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
        <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt']

3 个答案:

答案 0 :(得分:2)

为什么不直接将print添加到printf行?

printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
<img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a><br>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );

甚至更好,使用css来设置样式,例如:

echo '<div class="images">';
foreach ($res3 AS $row3) { 

    printf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
    <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );

}
echo '</div>';

CSS:

div.images a { display: block; }

除非我完全误解了这个问题。

编辑::

看到你的新编辑,你需要使用sprintf:

foreach ($res AS $row) { 
    $story = '<p>' . preg_replace("/\n|\n\r|\n\r/", '<br>', $row['story']) . '</p>' . PHP_EOL;


    $qry3 = "select * from tpf_images where news_id=".$row['news_id'];
    $res3 = $pdo->query($qry3);

    $images = '';
    foreach ($res3 AS $row3) { 
        $images .= sprintf('<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s. Photo Credit - %s" >
        <img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $row3['url'], $row3['alt'], $row['headline'], $str ,$row3['credit'], $row3['url'], $row3['alt'], $row3['alt'] );
    }
    $story = preg_replace('/<br><br>/', '<br>' . $images . '</br>', $story);
}

答案 1 :(得分:0)

user2574794。 你要求的并不完全“清楚”。

顺便说一下,为什么不使用简单的str_replace()? 类似的东西:

str_replace('<br /><br />', '<br /><br />blabla', nl2br($row['story']));

答案 2 :(得分:0)

使用str_replace()函数删除<br/>

删除中断行:

str_replace(array('<br>','<br/>','',strtolower($row['story'])))

将故事放在<span>内,并将<span><img>左侧文字对齐。

我建议您使用<li>,因为它很容易设计样式(垂直和水平文本对齐)