2010-12-04 24 views
-1

Je ne sais pas c'est une question d'architecture ou non, s'il vous plaît corriger si je me trompe, ok j'ai des tableaux (en utilisant un foreach)n'affiche pas les mêmes étiquettes? en 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 

faire quelqu'un a une idée comment montrer

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

comme stackoverflow avoir?

modifier un (AOP)

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

modifier deux quand je fais

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

il fonctionne, mais certains produits ne sont pas affichés.

  • tous les produits est affiché
  • mais les balises sont comme ci-dessus.

merci pour votre temps btw, c'est économiser mon temps d'apprentissage beaucoup.

éditer * ça marche. remercie tous

$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>'; 
     } 

acheter faire ce que je reçois encore tous mes produits avec une liste de balises pas en double + compteur. Merci encore!.

+0

Cela pourrait facilement être réalisé en changeant votre requête DB. Pouvez-vous montrer cette section du code? – riwalk

+0

édité, merci pour l'intérêt –

Répondre

1

Vous pouvez utiliser un tableau pour rappeler les éléments qui ont déjà été affichés:

$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>'; 
} 

Ou vous trier le tableau à l'avance et juste comparer l'élément actuel avec le précédent:

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++; 
    } 
} 

Mais vous pouvez probablement faire la même chose dans votre requête de base de données et il suffit de prendre les résultats comme:

SELECT tag, COUNT(tag) AS counter 
FROM table 
GROUP BY tag 
ORDER BY tag 
1

Quelle requête utilisez-vous pour extraire les données de SQL? Probablement nous pouvons le faire à partir du niveau SQL?

quelque chose comme

Select tag, count(tag) from products group by tag; 
+0

le faire mais il semble que mon produit ne montre pas tout, c'est en raison de la balise de groupe. Je veux apprendre est de faire mes produits (tout afficher) mais en faisant des balises jointes si même, en quelque sorte. vous pouvez le voir d'en haut. ive fait une modification. –

+0

Vous n'avez pas le 'count (tag)' sur votre requête, pouvez-vous essayer? –

1

Vous devez modifier probablement votre requête pour renvoyer les données dans deux colonnes, tag et count. Sans voir votre requête, je ne peux pas vous dire comment faire cela.

Vous pouvez également modifier l'organisation de vos balises sans modifier la requête:

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

Vous n'avez pas ces codes supplémentaires, vous utilisez la fonction array_count_values. Voici un exemple -

<?php 

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

?>