我有一个名为“tags”的MySQL字段是一个示例结果。单个字段具有逗号分隔值的文本列表。
一个真实的例子:
red, pants, shoes, heels, lookbook
我想以某种方式使用查找和替换或内爆功能将此行打印为单独的链接。
我的猜测到目前为止:
<?php
$tag=$row["tags"];
whilst (!$tag=="") {
echo '<a href="/tags/$tag">$tag</a>, "';
}
?>
答案 0 :(得分:3)
explode()
foreach
implode()
示例:
$tags = explode(", ", $row["tags"]);
foreach ($tags as &$tag) {
$tag = "<a href=\"/tags/$tag\">$tag</a>";
}
echo implode(", ", $tags);
另一种方法是使用preg_replace
:
$row['tags'] = "banana, apple, peach, strawberry";
echo preg_replace( '#([^,\s]+)#is',
'<a href="/tags/$1">$1</a>',
$row['tags']);
答案 1 :(得分:3)
您应该首先看一下这个答案SQL Array Search(如何在数据库中存储这样的信息)。如果您仍想使用逗号分隔列表,最好的方法可能是使用explode()
,array_map()
和implode()
:
function generateLink( $tag){
$tag = htmlspecialchars( trim( $tag));
$str = "<a href=\"/tags/$tag\">$tag</a>";
}
$tags = explode( ',', $row['tags']);
$new_tags = array_map( 'generateLink', $tags);
echo implode( ', ', $new_tags);
// Of course you can chain it to:
echo implode( ', ', array_map( 'generateLink', explode( ',', $row['tags'])));
但是,如果您使用正确的数据库设计,则应该SELECT
(显示一个产品):
SELECT tags.name
FROM tags_products
INNER JOIN tags ON tags_products.tag_id = tags.id
WHERE tags_products,product_id = ?
用php:
$q = $db->query( 'mentioned select');
$result = array();
while( $row = $q->fetch_assoc()){
$result[] = genereateLink( $row['name']);
}
如果要大量列出产品以提高性能,请使用GROUP_CONCAT
选择
SELECT products.id, products.name, GROUP_CONCAT(tags.name ASC SEPARATOR ', ') AS tags
FROM products
LEFT JOIN tags_products ON tags_producsts.product_id = products.id
INNER JOIN tags ON tags_products.tag_id = tags.id
GROUP BY products.id
并在$row['tags']
上应用首先提到的代码:)