【问题标题】:What is wrong with this loop code这个循环代码有什么问题
【发布时间】:2012-02-06 10:45:09
【问题描述】:

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

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

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

错误行号在'return'行的函数dos_slug_exists()中。

(该数组仅作为示例,我将使用 db 验证。)

如果我将数组替换为:

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

然后我得到 title-1。

错在哪里?

【问题讨论】:

  • 为什么需要递归调用loop_slug_number?您也可以使用“while”循环来做到这一点。
  • 是的。但是听到了什么问题?
  • 问题是“数字”直到loop_slug_number 被调用后才会增加。因此,loop_slug_number 总是以“number = 1”调用

标签: php url


【解决方案1】:

忽略任何关于代码质量的 cmets,这里的问题是 $number 变量的后增量。您可以替换为:

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

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

【讨论】:

    【解决方案2】:
    // 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,增加数字。

    【讨论】:

      【解决方案3】:

      我不确定 PHP,但在 C 中你应该使用 ++number 代替。这个想法是,如果您执行number++,则在调用函数之后,如果您执行++number,则在调用该函数之前。

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

      【讨论】:

      • 您可以打印以查看loop_slug_number 中的number 值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多