如何从单词列表生成随机slug

时间:2016-04-11 02:35:48

标签: php mysql performance pdo slug

我正在尝试根据约100字的字典创建一个随机slu ..我已经提出了以下解决方案,但我一直在考虑它太长时间,无法判断它是否有效,无法弄清楚如何正确测试它。

class SlugModel
{
    /**
     * Get random words from the slug_words table
     * @param int $limit how many words should be fetched
     * @return array the array of random words
     */
    public static function getRandomSlugWords($limit)
    {
        // returns random words in an array. Ex: 
        return array('pop', 'funk', 'bass', 'electro');
    }

    /**
     * Generate a random slug based on contents of slug_words
     * @return str the slug
     */
    public static function generateSlug($limit=4)
    {
        do {
            $words = self::getRandomSlugWords($limit);
            $slugified = implode('-', $words);
            if(PlaylistModel::doesSlugAlreadyExist($slugified)) // returns true or false
            {
                // try a few different combinations before requesting new words from database
                for ($i=0; $i < $limit; $i++) 
                { 
                    $words[] = array_shift($words); // take the first and shift it to the end
                    $slugified = implode('-', $words);
                    if(!PlaylistModel::doesSlugAlreadyExist($slugified)) // break only if it does NOT exist
                        break;
                }
            }
        } while (PlaylistModel::doesSlugAlreadyExist($slugified));

        return $slugified;
    }
}

我认为这段代码有效但我也认为它可以提高效率,或者我可能会过度思考它。我也可以像

一样简单
    do {
        $words = self::getRandomSlugWords($limit);
        $slugified = implode('-', $words);
    } while (PlaylistModel::doesSlugAlreadyExist($slugified));

但是我试图在用另一个不同单词的请求ping数据库之前测试相同单词的不同组合(我使用RAND()来获得随机结果并尝试最小化这个)。

任何见解都表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:0)

我认为为获得限制+ N个随机单词进行单个查询是一种更好(更快,资源友好)的方法。例如,每当我们需要一个由4个元素组成的slug时,让我们选择8个单词。

SELECT slug FROM `slugs` ORDER BY RAND() LIMIT 8;

在这种情况下,我们将洗牌一个包含两倍我们将使用的项目的数组 - 有4个4乘4的24个排列,而有8个4乘以1680个排列 - 留下我们更可能有效的slu with少查询。

在这种情况下,我们会有一个

public static function getRandomSlugs($limit)   
{
    shuffle(self::$slugs);                       // 8 words from database
    return array_slice(self::$slugs, 0, $limit); // we only need 4
}

并使用

public function generateSlug($limit = 4)
{
    do {
        $slugs = self::getRandomSlugs($limit);  // Get N slugs
        $mySlug = implode('-', $slugs);         // Join the elements
    } while ($this->slugExists($mySlug));

    return $mySlug;
}

检查是否已经采取了一个slu can可以通过几种方式完成;从数据库中选择列是slug,或将表设置为唯一并检查插入数据的返回值。

无论如何,请记住保持方法简短,精确和干净。