2010-12-04 12 views
-1

ない、これはアーキテクチャの問題やないことを確認して、私が間違っている場合は、[OK]を は、私は誰もがは同じタグを表示していませんか? PHP

を表示する方法のアイデアを持っていない(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) 

like stackoverflow have?

編集1(PDO)

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

編集2私はこの

$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

これは、DBクエリを変更することで簡単に達成できます。コードのその部分を表示できますか? – riwalk

+0

編集あり、ありがとうございました –

答えて

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

していますが、私の製品はタグでグループ化されているため、表示されていないようです。私が学びたいのは、私の製品(すべてを表示)を作ることですが、タグが同じであれば、どうにかして結合することです。上から見ることができます。 iveは編集を行いました。 –

+0

クエリに 'count(tag)'がありません。試してみることはできますか? –

1

のようにあなたは、おそらく2つの列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); 

?>

関連する問題