Php 如何从单词列表生成随机段塞

Php 如何从单词列表生成随机段塞,php,mysql,performance,pdo,slug,Php,Mysql,Performance,Pdo,Slug,我正试图根据大约100个单词的字典创建一个随机段塞。我已经想出了下面的解决方案,但我想得太久了,不知道它是否有效,也不知道如何正确地测试它 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

我正试图根据大约100个单词的字典创建一个随机段塞。我已经想出了下面的解决方案,但我想得太久了,不知道它是否有效,也不知道如何正确地测试它

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;
    }
}
但是,在用另一个不同单词的请求ping数据库之前,我尝试测试相同单词的不同组合(我使用RAND()来获得随机结果,并尝试将其最小化)


任何洞察都将不胜感激!谢谢大家!

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

SELECT slug FROM `slugs` ORDER BY RAND() LIMIT 8;
在本例中,我们将洗牌一个数组,该数组包含两倍于我们将使用的项—有24个4乘4的排列,而有1680个8乘4的排列—这样我们就可以用更少的查询获得更多可能的有效段塞

那样的话,我们会有一个

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;
}
检查是否已经取下段塞可以通过两种方式完成;从列为slug的数据库中进行选择,或者将表设置为唯一并在插入数据时检查返回值


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

谢谢!这很有帮助。shuffle()是否有可能返回相同的排列?这可能不太可能,但仍然可能不?是的。即使如此,这也是为什么我们使用do while语句来检查slug。
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;
}