【问题标题】:PHP Separate comma list with linksPHP 用链接分隔逗号列表
【发布时间】:2012-03-03 18:38:18
【问题描述】:

我有一个名为“tags”的 MySQL 字段作为示例结果。单个字段有一个带有逗号分隔值的文本列表。

一个真实的例子:

red, pants, shoes, heels, lookbook

我想以某种方式使用查找和替换或内爆功能将此行打印为单独的链接。

到目前为止我的猜测:

<?php
$tag=$row["tags"];
whilst (!$tag=="") { 
echo '<a href="/tags/$tag">$tag</a>, "';
}
?>

【问题讨论】:

  • explode() 将工作。然后使用 foreach 遍历结果

标签: php mysql list replace


【解决方案1】:
  1. 使用explode()将逗号分隔的列表拆分为一个数组
  2. 使用foreach将列表中的每个元素转换为链接
  3. 使用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,2,3,4,
  • 那么我可以在新字符串上使用替换最后一个吗?
  • 您也可以从字符串中删除最后一个逗号,但我认为我编辑的帖子中的方法要好得多
  • @Vyktor 认真的,我的意思是在 foreach 中使用引用(尽管您所说的更改数据库结构当然要好得多)
【解决方案2】:

你可能应该先看看这个答案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'] 上应用第一个提到的代码:)

【讨论】:

  • @Kaii 如果你有关于如何设计这样一个表格的教程,我很乐意添加它...我很难找到英文版。
  • 欣赏所有 cmets - 我采用这种方法的原因是我不想要另一个名为与产品关联的标签的表。所以我把它排成一行。感谢所有cmets。重复
  • @TheBlackBenzKid 当您的数据库增长和/或您想添加功能(例如,按标签搜索)时,您将遇到该方法的性能问题。我们警告过你;)
猜你喜欢
  • 2013-07-03
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2021-09-05
相关资源
最近更新 更多