2012-02-06 50 views
1

所以我寫了一些代碼來製作網站友好的網址。這些函數首先創建一個seo-friendly slug,然後如果已經存在的slug是數據庫(在這種情況下是數組),那麼它們會在其旁邊添加一個破折號。如果這也存在,那麼他們只是+1的數字,然後再次檢查...這個循環代碼有什麼問題

例如。如果我通過「標題URL」的功能。首先它會將它轉換爲「title-url」,如果「title-url」已經存在,那麼它會添加一個像「title-url-1」這樣的數字,如果它存在,那麼它會+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; 
} 

我覺得一切都應該正常工作。但是當我回聲slu((「標題」);我越來越

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

錯誤行號是在函數does_slug_exists()在'返回'行。

(陣列僅僅是例如我將使用分貝驗證。)

另外,如果我更換與陣列:

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

然後我得到標題-1回。

錯誤在哪裏?

+0

爲什麼你需要遞歸調用'loop_slug_number'?你也可以用「while」循環來完成它。 – 2012-02-06 10:49:45

+0

是的。但是問題聽到了什麼? – Ameer 2012-02-06 10:55:07

+1

問題在於,在調用'loop_slug_number'之後,「數字」纔會增加。因此,'loop_slug_number'總是被稱爲「number = 1」 – 2012-02-06 11:20:58

回答

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開始數字slug存在,增加數字。

0

我不確定關於PHP,但在C中,您應該執行++number。這個想法是之後,如果你做了number++,並且如果你做++number,那麼函數被調用。

..遞增/遞減運算的樂趣...

+0

試過了。不工作。 – Ameer 2012-02-06 10:57:25

+0

您可以執行打印以查看'loop_slug_number'中的'number'值。 – 2012-02-06 11:21:51

1

忽略對代碼質量有任何意見,這裏的問題是$number變量的滯後遞增。你可以替換爲:

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

但是,我建議整個函數應該被重寫爲while循環而不是僞遞歸函數。另外,看起來每次調用does_slug_exists()時都會進行DB查詢;我建議你重構這個查詢一次並存儲返回的結果集。看看this example