2016-04-11 7 views
2

約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; 
    } 
} 

私はこのコードがうまくいくと思うが、私はまた、より効率的にすることができるか、私はそれをoverthinkingすることができると思います。私はまた、

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

として、それは同じくらい簡単かもしれない。しかし、私は(私が無作為化結果を得るために、RAND()を使用したとしようとしている別の単語の別の要求をデータベースにpingを実行する前に、同じ単語の異なる組み合わせをテストしようとしていますこれを最小にする)。

洞察力がありがとう!ありがとうございました!

答えて

0

制限+ N個のランダムな単語を取得するための単一のクエリを実行する方が良い(より速く、リソースにやさしい)アプローチだと思います。たとえば、4つの要素から構成されたスラッグが必要なときはいつでも、8語を選択します。この場合

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

、我々が使用する二回のアイテムを含む配列をシャッフルします - 4で8の1680個の順列がある一方、4の24個の順列は、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; 
} 

を使用して、私たちの道を作ります。列があなたのスラッグであるデータベースから選択するか、テーブルを一意に設定し、データの挿入時にリターンをチェックします。

とにかく、メソッドを短く、正確に、きれいに保つことを忘れないでください。

+0

ありがとうございました!これは役に立ちます。シャッフルしても、同じ順列を返す可能性はありますか?それはおそらくありませんが、まだ可能ですか? – cwal

+0

です。それでも、これはスラッグをチェックするためにdo whileステートメントを使用している理由です。 –

関連する問題