PHP Отдельный список запятых со ссылками - PullRequest
1 голос
/ 11 февраля 2012

У меня есть поле MySQL с именем «tags» в качестве примера. В одном поле есть список текста с разделенными запятыми значениями.

Реальный пример:

red, pants, shoes, heels, lookbook

Я хочу каким-то образом использовать функцию поиска, замены или взлома для вывода этой строки в виде отдельных ссылок.

Мое предположение на данный момент:

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

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012
  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']); 
3 голосов
/ 11 февраля 2012

Вероятно, вам стоит сначала взглянуть на этот ответ Поиск в массиве SQL (как хранить такую ​​информацию в базе данных).Если вы все еще хотите использовать список, разделенный запятыми, лучше всего использовать 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']:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...