4

我正在一个 php 站点中创建一个 jquery tagcloud。在我的 mysql 数据库中,我有一个“标签”字段,其中会有一个逗号分隔的单词列表。我想产生一个单词数组,它们出现的频率。只是为了使事情复杂化,文本将全部采用希伯来语(utf8 编码)。

用英语,这个解决方案完美地工作:

$words = array_count_values(str_word_count($str, 1));
print_r($words);

取自这里php:对给定字符串中单词的实例进行排序和计数

使用希伯来文文本,数组未填充。

我发现这个帖子str_word_count() 函数不能正确显示阿拉伯语,虽然它可以工作,但它只给出单词的总数,并且不会像前面的函数那样创建结果数组。

我希望结果看起来像这样:

Array
(
    [happy] => 4
    [beautiful] => 1
    [lines] => 3
    [pear] => 2
    [gin] => 1
    [rock] => 1
)

有什么建议么?

4

2 回答 2

2

尽管这并不是您所希望的答案,但我会鼓励您首先重新考虑您的 DB-Design。在一个字段中保存多个逗号分隔的标签不是很聪明。您应该为只有两列的标签构建一个单独的表:

  1. 标签
  2. 相应对象/帖子的 id 或您的应用程序的任何内容

有很多优点:

  • 删除或添加标签更容易。
  • 您可以使用单个 SQL 查询(例如“从标签分组中选择标签,计数(id)”)获得您正在寻找的数组,而无需使用一些糟糕的 php 代码
  • 当您有许多标签时,这会更容易、更快。
  • 最后但并非最不重要的一点是,我敢打赌(不确定),MySQL 不会出现您显然在 php 中遇到的不同字母的问题-
于 2013-06-18T13:58:53.993 回答
1

可以使用 PHP 的 PCRE 函数的 Unicode 模式制作 UTF-8(仅限!)版本。

function utf8_str_word_count($string, $format = 0, $charlist = null) {
    if ($charlist === null) {
        $regex = '/\\pL[\\pL\\p{Mn}\'-]*/u';
    }
    else {
        $split = array_map('preg_quote', 
                           preg_split('//u',$charlist,-1,PREG_SPLIT_NO_EMPTY));
        $regex = sprintf('/(\\pL|%1$s)([\\pL\\p{Mn}\'-]|%1$s)*/u',
                         implode('|', $split));
    }

    switch ($format) {
        default:
        case 0:
            // For PHP >= 5.4.0 this is fine:
            return preg_match_all($regex, $string);

            // For PHP < 5.4 it's necessary to do this:
            // $results = null;
            // return preg_match_all($regex, $string, $results);
        case 1:
            $results = null;
            preg_match_all($regex, $string, $results);
            return $results[0];
        case 2:
            $results = null;
            preg_match_all($regex, $string, $results, PREG_OFFSET_CAPTURE);
            return empty($results[0])
                ? array()
                : array_combine(
                      array_map('end', $results[0]), 
                      array_map('reset', $results[0]));
    }
}

str_word_count这个函数尽可能地遵循语义;特别是,如果您在以下注释中将“localedependent”替换为“UTF-8”,str_word_count则结果适用于此

出于此功能的目的,“word”被定义为包含字母字符的区域设置相关字符串,它也可以包含但不能以“'”和“-”字符开头。

此外,字符'-被认为是单词的一部分,但不能开始;但是,$charlist参数中指定的任何字符都可以开始一个单词,这意味着指定'和/或-稍微改变函数的工作方式。此行为也与原始str_word_count.

值得注意的是,您可以通过适当地替换\pL为字符属性(例如,\p{Greek}参见PCRE Unicode 参考)使该函数仅识别 Unicode 脚本的某些子集。

于 2013-06-18T14:44:58.043 回答