2

我有一个函数,给定文件名和目录路径,检查目录是否已经包含同名的文件,如果是,则返回修改后的文件名(通过在文件名的第一部分后附加一个数字)。(get_filenames() 函数是一个 CodeIgniter 辅助函数,它创建一个包含指定目录中所有文件名的数组。)

当我尝试打印出函数调用的返回结果时,我什么也得不到;但是如果我在函数本身的 else{} 语句中打印 $new_filename ,然后只需调用该函数(而不是打印它的值),它就可以工作!

我需要返回函数中的值,而不是打印它,因为我实际上需要将结果分配给一个变量以进行进一步处理。(在下面的示例中,我刚刚打印了函数调用的结果来证明这一点。)

功能:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count)
{   
    $num = '';
    if ($count > 0):
        $num = $count;
    endif;

    $filename_arr = explode('.', $old_filename, -1);
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];

    if (in_array($new_filename, get_filenames($dir))):      
        $count++;
        avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
    else:
        return $new_filename;
    endif;
}

我在哪里调用函数:

print avoid_conflicting_filenames('file.jpg', '', 'path/to/file', 0);

在过去的一天里,这一直让我发疯,所以任何帮助将不胜感激!谢谢。

4

4 回答 4

10

替换这个:

avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);

有了这个:

return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);

你不是在递归地考虑它。您必须返回函数的返回值。

过去,if 语法是怎么回事?我在模板中容忍它,但是对于代码?嗯。

如果我正确理解代码,您还可以重写此函数以避免递归,如下所示:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir) {   
    $num = 0;
    $files = get_filenames($dir);
    $filename_arr = explode('.', $old_filename, -1);
    do {
        $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];
        $num++;
    } while(in_array($new_filename, $files));
    return $new_filename;
}

我认为这更好,更容易获得,但这取决于你......

于 2009-06-18T09:43:35.717 回答
2

将您的代码更改为:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count)
{   
    $num = '';
    if ($count > 0):
        $num = $count;
    endif;

    $filename_arr = explode('.', $old_filename, -1);
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];

    if (in_array($new_filename, get_filenames($dir))):          
        $count++;
        return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
    else:
        return $new_filename;
    endif;
}

在避免冲突文件名中调用避免冲突文件名时,您忘记了返回语句。

于 2009-06-18T09:43:47.183 回答
0

您正在递归地运行该函数。您需要将结果传递给函数的“父”实例:

if (in_array($new_filename, get_filenames($dir))):          
    $count++;
    // Note "return" statement below.
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
else:
    return $new_filename;
endif;
于 2009-06-18T09:45:38.037 回答
0

如果第二个 if 中的第一个分支被采用,则该函数永远不会遇到 return 语句。

将其更改为:

if (in_array($new_filename, get_filenames($dir))):          
    $count++;
    //Added return
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
else:
    return $new_filename;
endif;
于 2009-06-18T09:46:32.013 回答