不显示相同的标签?在PHP
问题描述:
不知道这是一个结构问题或不是,请确定如果我错了, 确定我有一个数组(通过使用foreach)不显示相同的标签?在PHP
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)
像*有?
编辑一个(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");
它的工作,但有些产品没有显示。
- 所有产品显示
- 但标签就像上面。
感谢您的时间btw,它节省了我的学习时间很多。
编辑*它的工作。谢谢所有
$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>';
}
买这样做我仍然得到我所有的产品与一个标签列表没有重复+计数器。再次感谢!。
答
您可以使用一个数组来记住已经被显示的项目:
$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
答
你用什么查询来从SQL中提取数据?大概我们可以从SQL级别做到这一点?
像
Select tag, count(tag) from products group by tag;
答
你或许应该修改您的查询到两列,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>";
}
答
$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>';
}
答
你不这样额外的代码,您使用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);
?>
这可以通过更改您的数据库查询轻松实现。你能展示代码的那一部分吗? – riwalk 2010-12-04 18:13:56
编辑好了,感谢 – 2010-12-04 18:29:52