PHP只打印返回数组的最后一个元素

时间:2014-09-10 20:18:12

标签: php arrays foreach directory ads

我试图填充一个只有文件名以" 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的新手。

提前致谢!

2 个答案:

答案 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需要传递给后续调用。阅读更多关于递归..

当您的打印行处于活动状态时,它会在每次递归调用中调用,而不是在最后调用。