2

記事の件名からタグ クラウドを作成しています。各タイトルを取得し、単語に分割して配列に入れ、単語 strlen > 3 をチェックし、除外された単語配列には入れません。これはうまくいきます....

私が苦労しているビットは次のとおりです。

  • 順序をランダム化し、出力を 20 に制限する方法
  • 重複を除外します。重複とは、単語が重複しているが同じ catid にあることを意味します。

たとえば、次の例では、dog という単語が 5 回繰り返されていますが、3 つの異なる catid で使用されています。したがって、個別の catid ごとに dog という単語を 3 回出力したいと思います。配列:

'subject' => 'dog is running', 'id' => '1', 'catid' => '19'

'subject' => 'dog is walking', 'id' => '2', 'catid' => '18'

'subject' => 'dog is sitting', 'id' => '3', 'catid' => '18'

'subject' => 'dog is eating', 'id' => '4', 'catid' => '19'

'subject' => 'dog is barking', 'id' => '5', 'catid' => '20'

ここに私のコードがあります:

$excluded_word_array = array('a','blah','bleh');

// prepare the tag cloud array for display
$terms = array(); // create empty array

$query = mysql_query("SELECT * FROM hesk_kb_articles WHERE type = '0'");
while($row = mysql_fetch_array($query)){

        $subject = $row['subject'];
        $id = $row['id'];
        $catid = $row['catid'];
        $words = explode(" ", $subject);
        foreach ($words as $val){
                if (strlen($val) > 3) {
                        $stripped_val = strtolower(ereg_replace("[^A-Za-z]", "", $val));
                        if (!in_array($stripped_val, $excluded_word_array)) {
                        shuffle($stripped_val);
                        $terms[] = array('subject' => $stripped_val, 'id' => $id, 'catid' => $catid);
                        }
                }
        }
}

sort($terms);
?>
4

2 に答える 2

0
$query = mysql_query("SELECT * FROM hesk_kb_articles WHERE type = '0'");

SELECT * を使用すると、DISTINCT または GROUP BY を実行できず、一意にする必要があるフィールドのみを選択する必要があります。

このようなクエリは役に立ちます

$query = mysql_query("SELECT DISTINCT subject, catid FROM hesk_kb_articles WHERE type = '0'");

また

$query = mysql_query("SELECT subject, catid FROM hesk_kb_articles WHERE type = '0' group by subject, catid");

ID 列は一意であるため、返されるレコードの量を減らすために SQL を使用することはできません。PHP コードで ID が必要な場合。必要に応じて、subject-catid の組み合わせで SQL から ID を取得できます。

タグ サブジェクトがカテゴリに存在する場合は、再度挿入しないでください。

于 2013-04-18T10:32:20.737 に答える