这个循环代码有什么问题

时间:2012-02-06 10:45:10

标签: php url

所以我写了一些用于制作seo友好网址的代码。这些函数首先制作一个seo友好的slug然后如果slug已经存在的是DB(在这种情况下是数组),那么他们会在它旁边添加一个带短划线的数字。如果它也存在,那么他们只是+1号码,然后一次又一次地检查......

例如。如果我将“标题网址”传递给该函数。首先它会将它转换为“title-url”,如果“title-url”已经存在,那么它会添加一个像“title-url-1”这样的数字,如果它也存在那么它将+1这个数字像“title-url” url-2“然后”title-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;
}

我认为一切都应该正常。但当我回应slug(“标题”);我正在

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

错误行号位于'return'行的函数do_slug_exists()中。

(例如,数组我将使用数据库验证。)

如果我用以下代码替换数组:

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

然后我得到了冠军-1。

错误在哪里?

3 个答案:

答案 0 :(得分:1)

忽略有关代码质量的任何注释,此处的问题是$number变量的后增量。您可以替换为:

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

但是,我建议将整个函数重写为while循环而不是伪递归函数。此外,看起来每次调用does_slug_exists()时都会进行数据库查询;我建议您重构一次以进行一次查询并存储返回的结果集。看看this example

答案 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存在slug,增加数字。

答案 2 :(得分:0)

我不确定PHP,但在C中你应该做++number。我们的想法是,如果您执行number++,则在调用函数之后增加,如果执行++number,则会增加

..增量/减量运算符的乐趣......