не отображаются одинаковые теги?в php - PullRequest
0 голосов
/ 04 декабря 2010

Не уверен, что это архитектурный вопрос или нет, пожалуйста, исправьте, если я ошибаюсь, хорошо, у меня есть массивы (используя foreach)

foreach ($db['products'] as $product) 
{
    echo '<li><a href="">' . $product['tag'] . '</a></li>';
}

 // displays like
 tag1
 tag4
 tag2
 tag2
 tag1
 tag3
 tag1
 tag1
 tag3
 tag2
 tag3
 tag2

У кого-нибудь есть идея, как показать

//count tags & no duplicate tags ?
tag1(4)
tag2(4)
tag3(3)

как у stackoverflow есть?

редактировать один (PDO)

$database->fetchall("SELECT pid, uid, name, information, image_tumb, tag, price 
FROM products ORDER BY pid DESC LIMIT 100");

редактировать два, когда я делаю это

$db['products'] = $database->fetchall("SELECT pid, uid, name, information, image_tumb, tag, price 
FROM products GROUP BY tag ORDER BY pid DESC LIMIT 100");

это работает,но некоторые продукты не отображаются.

  • весь продукт отображается
  • но теги такие же, как и выше.

спасибо за ваше время, кстати, егосэкономить мое время обучения много.

редактировать * это работает.спасибо всем

$db['products'] = $database->fetchall("SELECT pid, uid, name, information, image_tumb, price 
FROM products ORDER BY pid DESC LIMIT 100");

$db['tags'] = $database->fetchall("SELECT tag, COUNT(tag) AS counter
FROM products GROUP BY tag ORDER BY tag DESC LIMIT 100");


        foreach ($db['tags'] as $tag) {
            echo '<li><a href="">' . $tag['tag'] . '(' . $tag['counter'] . ')</a></li>';
        }

купить, делая это, я все еще получаю все мои продукты со списком тегов без дубликатов + счетчик.еще раз спасибо!

Ответы [ 5 ]

1 голос
/ 04 декабря 2010

У вас нет таких дополнительных кодов, вы используете функцию array_count_values ​​.Вот пример -

<?php

$a = array("tag1", "tag4", "tag2", "tag2", "tag1", "tag3", 
            "tag1", "tag1", "tag3", "tag2", "tag3", "tag2");
$b = array_count_values($a);
print_r($b);

?>

1 голос
/ 04 декабря 2010
$productCounts = array();

foreach ($db['products'] as $product) {
    if (empty(productCounts[$product])) {
        $productCounts[$product['tag']] = 1;
    }
    else {
        $productCounts[$product['tag']]++;
    }
}

foreach ($productCounts as $product=>$count) {
     echo '<li><a href="">' . $product . '(' . $count . ')</a></li>';
}
1 голос
/ 04 декабря 2010

Вам, вероятно, следует изменить свой запрос, чтобы он возвращал данные в двух столбцах, tag и count.Не видя вашего запроса, я не могу сказать вам, как это сделать.

Вы также можете изменить организацию своих тегов без изменения запроса:

// Build a tag => count mapping
$tags = arrya();
foreach ($db['products'] as $product) 
{
    if (array_key_exists($product['tag'], $tags))
      $tags[$product['tag']] += 1;
    else
      $tags[$product['tag']] = 1;
}

// Display the tags with their counts
foreach ($tags as $tag => $count) {
    echo "<li><a href=\"\">$tag($count)</a></li>";
}
1 голос
/ 04 декабря 2010

Вы можете использовать массив для запоминания уже отображенных элементов:

$items = array();
foreach ($db['products'] as $product) {
    if (!isset($items[$product['tag']]) {
        $items = 1;
    } else {
        $items++;
    }
}
foreach ($items as $tag => $count) {
    echo '<li><a href="">' . $product['tag'] . ' (' . $count . ')</a></li>';
}

Или вы предварительно сортируете массив и просто сравниваете текущий элемент с предыдущим:

array_multisort($db['products'], array_map(function($item) { return $item['tag']; }, $db['products']));
$previous = null;
foreach ($db['products'] as $product) {
    if ($product['tag'] !== $previous['tag']) {
        if ($previous !== null) {
            echo '<li><a href="">' . $product['tag'] . ' (' . $counter . ')</a></li>';
        }
        $counter = 0;
    } else {
        $counter++;
    }
}

Но вы, вероятно, можете сделать то же самое в вашем запросе к базе данных и просто получить результаты вроде:

SELECT tag, COUNT(tag) AS counter
FROM table
GROUP BY tag
ORDER BY tag
1 голос
/ 04 декабря 2010

Какой запрос вы используете для извлечения данных из SQL?Возможно, мы можем сделать это с уровня SQL?

что-то вроде

Select tag, count(tag) from products group by tag;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...