PHP用链接分隔逗号列表

时间:2012-02-11 17:19:08

标签: php mysql list replace

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

一个真实的例子:

red, pants, shoes, heels, lookbook

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

我的猜测到目前为止:

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

2 个答案:

答案 0 :(得分:3)

  1. 使用explode()
  2. 将逗号分隔列表拆分为数组
  3. 使用foreach
  4. 将列表中的每个元素转换为链接
  5. 使用implode()
  6. 将数组转换为逗号分隔列表

    示例:

    $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']上应用首先提到的代码:)