PHP MySQL - 递归函数的尝试

标签 php mysql recursion

我正在尝试我的第一个递归函数(至少我认为我是!)但只成功了一半。一、代码:

function check_title($i,$title) {
    $q=mysql_query("SELECT Title FROM posts WHERE Title = '$title'");
    $num=mysql_num_rows($q);
    if($num==0) {
            return $title;
    }else {
            $title=$title.' ('.$i++.')';
            check_title($i,$title);
    }
}

我正在做的是获取一个字符串(标题)并检查数据库中是否已经存在该标题。如果是这样,我想在较新的重复项上附加一个数字(例如,“我是标题”变成“我是标题 2”)。然后,我需要再次运行该函数以检查我的标题的这个新版本,并根据需要增加附加值(“I Am A Title-3”)。一旦没有发现重复,就以可接受的形式返回标题。

它在没有发现重复时工作(简单的一点),但在发现重复时失败。不是附加数字,而是清空整个标题变量。

如有任何帮助,我们将不胜感激!

最佳答案

正如 Mchl 所说,空标题是由于 else 分支中缺少返回。

但是,该函数存在问题,因为它没有按照您的预期执行。目前,您的函数正在将 $title 构建为“Title-1-2-3-4-etc”,这与您当前将数字附加到标题并再次检查的方式相同。与其在递归调用中传递修改后的标题,不如传递基本标题。然后,对于查询,修改标题。

function check_title($title, $i = 0) {
    $qtitle = $title . ($i == 0 ? '' : "-$i");
    $q=mysql_query("SELECT Title FROM posts WHERE Title = '$qtitle'");
    $num=mysql_num_rows($q);
    if($num==0) {
        return $title . ($i == 0 ? '' : "-$i");
    }else {
        return check_title(++$i,$title);
    }
}

PS,我还更改了参数的顺序,这样您的初始调用就不需要指定 0。

$title = check_title($title);

PPS,我应该提到这是通过递归实现的解决方案。但是,递归解决方案在这里不是合适的解决方案,因为它不必要地返回数据库。相反,您应该使用一个 sql 查询来选择所有标题 LIKE "$title%"Order by title asc。然后,遍历每个结果并与标题进行正则表达式比较,看它是否匹配模式 <title>|<title>-<#>。如果它确实增加了一个重复的计数器。最后,您吐出带有附加计数器值的标题。我会将该解决方案作为原始海报的练习。

关于PHP MySQL - 递归函数的尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883191/

相关文章:

php - 无法使用 Microsoft 帐户登录

php - 将动态网址转换为静态网址

来自审计跟踪数据库的 Mysql 用户事件报告

mysql - 如何在组mysql表中选择最大值

python - 找到具有 k 个唯一字母的最大可能子串。 (递归)

python - 如何在Python中创建嵌套的生成器结构?

php - 当第一个更改时重置第二个 jquery 下拉选择框

java - 我们如何在依赖注入(inject) Controller 中添加值?

php - 访问网络托管服务上 phpMyAdmin 的权限

haskell - 箭头中的可观察递归(或绑定(bind))