2

我从文章主题标题创建标签云。我得到每个标题,分成单词并将它们放入一个数组中,检查单词 strlen > 3 而不是我的排除单词数组。这很好用....

我正在努力解决的问题是:

  • 如何随机化顺序并将输出限制为 20
  • 排除重复项,重复项是指重复的单词,但在同一个 catid 中。

例如,下面的单词 dog 在 3 个不同的 catid 中重复了 5 次。因此,我想为每个不同的 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

1

您可以为此使用Group BY

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

自 PHP 5.5.0 起, mysql*函数也被弃用,并将在未来被删除。相反,应该使用MySQLiPDO_MySQL扩展

更新1:

也许这可以帮助你:

$excluded_word_array = array('a','blah','bleh');
$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(preg_replace("[^A-Za-z]", "", $val));
            if (!in_array($stripped_val, $excluded_word_array)) {
                $terms[$catid][] = $stripped_val;
            }
        }
    }
}

$items = array();
foreach ($terms as $term) {
    $term = array_unique($term);
    $items = array_merge($items, $term);
}

$items将包含您想要的所有单词。

更新 2:

如果您希望 catid 与单词一起使用,请更改最后一个 for 循环:

$i = 0;
$items = array();
foreach ($terms as $term_key => $term_value) {
    $term_value = array_unique($term_value);
    $items[$i]['catid'] = $term_key;
    $items[$i]['words'] = implode(',', $term_value);
    $i++;
}

现在 $items 将包含 catid 和用逗号分隔的单词。

更新 3:

如果您希望每个 catid 和单词分开,那么您可以这样做:

$i = 0;
$items = array();
foreach ($terms as $term_key => $term_value) {
    $term_value = array_unique($term_value);
    foreach ($term_value as $term) {
         $items[$i]['catid'] = $term_key;
         $items[$i]['words'] = $term;
         $i++;
    }
}

希望这可以帮助你:)

于 2013-04-18T10:15:09.020 回答
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。

您应该考虑在您的表上为主题-catid 对设置一个 UNIQUE 约束,以避免这种类型的“重复”,如果标签主题存在于某个类别中,则不应再次插入它。

于 2013-04-18T10:32:20.737 回答