2012-02-06 3 views
1

私は親切なURLを作成するためのコードを書いています。これらの関数は、最初に親しみやすいスラッグを作成し、スラッグが既に存在する場合はDB(この場合は配列)で、隣にダッシュを付けた数値を追加します。それが存在する場合は、番号を+1した後、何度も何度も確認します。このループコードで何が問題になっています

例:関数に "title url"を渡すと。最初にそれを "title-url"に変換し、 "title-url"がすでに存在する場合は "title-url-1"のような数字を追加します。もし存在すれば "title-その上のurl-2" とし、 "タイトル-URL-3" と...

これはコードです:

// CONVERTS STRING TO URL SLUG 
function str_to_slug($str){ 
    $str = strtolower(trim($str)); 
    $str = preg_replace('/[^a-z0-9-]/', '-', $str); 
    $str = preg_replace('/-+/', "-", $str); 
    return $str; 
} 

// RETURN SLUG URL 
function slug($title){ 
    $ori_url = str_to_slug($title); 
    if(does_slug_exists($ori_url)){ 
     return loop_slug_number($ori_url, 1); 
    } 
    else{ 
     return $ori_url; 
    } 
} 

// ADD NUMBER 
function loop_slug_number($slug, $number){ 
    if(does_slug_exists($slug.'-'.$number)){ 
     loop_slug_number($slug, $number++); 
     exit; 
    } 
    else{ 
     return $slug.'-'.$number; 
    } 
} 

// CHECKS WHEATHER THE SLUG EXISTS IN THE DB 
function does_slug_exists($slug){ 
    $array = array("title", "title-0", "title-1", "title-2"); 
    return (in_array($slug, $array)) ? true : false; 
} 

私はすべてがうまく動作するはずだと思います。しかし、私はスラグ( "タイトル")をエコーし​​ます。私は得ています

Fatal error: Maximum function nesting level of '100' reached, aborting! 

エラー行番号は、 'return'行でdoes_slug_exists()関数にあります。

(配列は単なるたとえば、私は、DBの検証を使用しますです。)

私は配列を置き換える場合も:

$array = array("title", "title-0", "title-2", "title-3"); 

、私はタイトル-1を取り戻します。

どこが間違いですか?

+0

なぜ 'loop_slug_number'の再帰呼び出しが必要ですか?あなたはちょうど同様に "while"ループでそれを行うことができます。 –

+0

はい。しかし、何が問題なのですか? – Ameer

+1

問題は、「数」が「loop_slug_number」が呼び出されるまで増分しないということです。したがって、 'loop_slug_number'は常に" number = 1 "と呼ばれ、 –

答えて

0
// ADD NUMBER 
function loop_slug_number($slug, $number){ 
    if(does_slug_exists($slug.'-'.$number)){ loop_slug_number($slug, $number++); exit;  }else{ return $slug.'-'.$number; } 
} 

これは本当にひどいコードです。ループの代わりにwhileループを使用してください。 0で番号を開始し、whileスラッグが存在する場合は、番号を増やします。

0

PHPについてはわかりませんが、Cでは代わりに++numberを実行してください。あなたがnumber++を実行し、++numberを実行すると、関数が呼び出された後に、の後に数値がインクリメントされてになるという考えがあります。

...インクリメント/デクリメント演算子の喜び...

+0

が試しました。動作しませんでした。 – Ameer

+0

'loop_slug_number'の' number'値を見るために印刷することができます。 –

1

は、コードの品質についてのコメントを無視すると、ここでの問題は$number変数のポストインクリメントです。私は擬似再帰関数とは対照的に、全体の機能は、whileループのように書き換えるべきであることを示唆している、しかし

return loop_slug_number($slug, ++$number); 

:あなたはと置き換えることができます。さらに、does_slug_exists()の各呼び出し時にDBクエリが作成されたようです。これをリファクタリングしてクエリを一度作成し、返された結果セットを格納することをお勧めします。 this exampleをご覧ください。