2010-12-04 103 views
-1

不知道这是一个结构问题或不是,请确定如果我错了, 确定我有一个数组(通过使用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) 

像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"); 

它的工作,但有些产品没有显示。

  • 所有产品显示
  • 但标签就像上面。

感谢您的时间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>'; 
     } 

买这样做我仍然得到我所有的产品与一个标签列表没有重复+计数器。再次感谢!。

+0

这可以通过更改您的数据库查询轻松实现。你能展示代码的那一部分吗? – riwalk 2010-12-04 18:13:56

+0

编辑好了,感谢 – 2010-12-04 18:29:52

回答

1

您可以使用一个数组来记住已经被显示的项目:

$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

你用什么查询来从SQL中提取数据?大概我们可以从SQL级别做到这一点?

Select tag, count(tag) from products group by tag; 
1

你或许应该修改您的查询到两列,tagcount返回数据。没有看到你的查询,我不能告诉你如何做到这一点。

你也可以改变你的代码的组织,而无需修改查询:

// 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
$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

你不这样额外的代码,您使用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); 

?>