我试图填充一个只有文件名以" mp4"结尾的数组。使用递归函数查看子目录列表。
当我在返回语句之前使用 foreach 循环打印数组中的元素时,数组会正确显示所有元素。但是,当我从方法的返回创建一个变量并尝试再次遍历它时,我只收到数组中的最后一个条目。
这可能是由循环中的递归引起的吗?
我的代码如下:
<?php
function listFolderFiles($dir){
$array = array();
$ffs = scandir($dir);
foreach($ffs as $ff){
if($ff != '.' && $ff != '..'){
// This successfully adds to the array.
if(substr($ff, -3) == "mp4"){
$array[] = $ff;
}
// This steps to the next subdirectory.
if(is_dir($dir.'/'.$ff)){
listFolderFiles($dir.'/'.$ff);
}
}
}
// At this point if I insert a foreach loop,
// all of the elements will display properly
return $array;
}
// The new '$array' variable now only includes the
// last entry in the array in the function
$array = listFolderFiles("./ads/");
foreach($array as $item){
echo $item."<p>";
}
?>
任何帮助将不胜感激!我为这个邋..道歉。我是PHP的新手。
提前致谢!
答案 0 :(得分:2)
当你递归到子目录时,你需要将其结果合并到数组中。否则,该数组仅包含原始目录中的匹配文件,子目录中的匹配将被丢弃。
function listFolderFiles($dir){
$array = array();
$ffs = scandir($dir);
foreach($ffs as $ff){
if($ff != '.' && $ff != '..'){
// This successfully adds to the array.
if(substr($ff, -3) == "mp4"){
$array[] = $ff;
}
// This steps to the next subdirectory.
if(is_dir($dir.'/'.$ff)){
$array = array_merge($array, listFolderFiles($dir.'/'.$ff));
}
}
}
// At this point if I insert a foreach loop,
// all of the elements will display properly
return $array;
}
答案 1 :(得分:1)
你需要更多地研究递归,你没有将$数组传递给递归调用,所以你实际上只有第一个返回,所有后续调用的结果都会丢失
if(is_dir($dir.'/'.$ff)){
listFolderFiles($dir.'/'.$ff);
}
对listFolderFiles的调用需要将这些文件添加到当前的$数组中,并且$ array需要传递给后续调用。阅读更多关于递归..
当您的打印行处于活动状态时,它会在每次递归调用中调用,而不是在最后调用。