PHPackages                             andares/adarts - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. andares/adarts

AbandonedArchivedLibrary[Utility &amp; Helpers](/categories/utility)

andares/adarts
==============

a darts class

v1.6.2(8y ago)358.2k6MITPHPPHP &gt;=7.0.0

Since Oct 3Pushed 8y ago4 watchersCompare

[ Source](https://github.com/andares/adarts)[ Packagist](https://packagist.org/packages/andares/adarts)[ RSS](/packages/andares-adarts/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (8)Dependencies (1)Versions (9)Used By (0)

Adarts 使用说明
===========

[](#adarts-使用说明)

基于静态Darts实现了AC自动机的字符串匹配类库，支持UTF-8编码，目前在项目中用于敏感词功能。

**该库只支持PHP7及以上版本**，之前版本因为有C扩展实现了类似功能，也不需要这个。

因为并不精通算法，实现上更偏向于业务代码风格，较多地利用了php数组双向链表的特性。算法实现上若有不对，或是有更好的优化方案，**请狠狠给个merge request！**

更新与路线图
------

[](#更新与路线图)

功能描述实现版本修正在双数组模式下导入同路径词条引发的问题1.6调整部分方法及属性命名1.5搜索时增加`$limit`和`$skip`参数1.4增加批量查找功能，可一次获取所有命中词1.3修正查找失败时的指针偏移bug1.3更新内容详述
------

[](#更新内容详述)

### 1.6版本改动

[](#16版本改动)

在此库已稳定将近9个月后居然在工作中发现了`重要BUG`，运营在字典中添加了一个单个字的词条后，居然查找不到这个词。

经过排查，发现这是压缩为`Double Array`后的正常现象。双数组结构可以获取更高的执行效率，同时也让算法实现的功能更为单一：拿一个字典与匹配字串进行碰撞，判断字串是否有包含字典中的词条。

因此，经过双数组压缩过后的字典中的每个节点，是不能同时为过路节点又为末节点的。

也就是说，如果往字典中添加`小猪`和`小猪狗`这两个词条，执的结果是无法检查到`小猪`这个词条的。

经过取舍，为了保证该库和算法的设计本意，对字典的构建算法做了更改，当同时添加上述两个词条时，只有`小猪`会被加入。因为后者已经包含前者，所以并不会对“是否包含字典中的词条”这一检查目的造成影响。

### 1.5版本改动

[](#15版本改动)

> - 变更`getWordsByState()`方法更名为`getWordByState()`，原方法名做兼容性留存

安装
--

[](#安装)

一个简单的composer库而已：

```
composer require andares/adarts

```

序列化功能用到了msgpack，这个东西我很喜欢，推荐使用：

```
pecl install msgpack-2.0.1

```

安装完后在php.ini或是conf.d里加上`extension=msgpack.so`即可，线上环境莫忘重启fpm

创建字典
----

[](#创建字典)

```
$dict = new \Adarts\Dictionary();
$dict->add('word1')
    ->add('word2')
    ->add('word3')
    ->add('word4')
    ->confirm();

```

- add() 向字典中添加一个词条，返回$this，可像上面那样重复调用。
- confirm() 当词条添加完后生成darts树及失败指针。

当然我知道大家实际中一般都会这么用：

```
