我有一个函数,在给定文件名和目录路径的情况下,检查目录是否已包含具有相同名称的文件,如果是,则返回修改后的文件名(通过在文件名的第一部分后面附加一个数字)。 (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);
这让我在过去的一天疯狂,所以任何帮助都将不胜感激!感谢。
答案 0 :(得分:10)
替换它:
avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
有了这个:
return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
你没有递归地思考它。您必须返回函数的返回值。
过去那个,if语法是什么?我在模板中容忍它,但对于代码? EW。
如果我正确理解代码,你也可以重写这个函数以避免递归:
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;
}
我认为这样更好,更容易获得,但这取决于你......
答案 1 :(得分: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;
}
在avoid_conflicting_filenames中调用avoid_conflicting_filenames时忘记了return语句。
答案 2 :(得分: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;
答案 3 :(得分: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;