【问题标题】:PHP only printing last element of returned arrayPHP 只打印返回数组的最后一个元素
【发布时间】:2014-09-10 20:18:11
【问题描述】:

我正在尝试使用递归函数查看子目录列表来填充仅包含以“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 新手。

提前致谢!

【问题讨论】:

  • 当你进行递归调用时,你不会对它的返回值做任何事情。
  • 我敢打赌所有.mp4 文件都在子目录中,而不是顶级目录中。
  • 它对我来说很好:)
  • @Barmar 我确保它会检查。

标签: php arrays foreach directory ads


【解决方案1】:

递归到子目录时,需要将其结果合并到数组中。否则,数组只包含原始目录中的匹配文件,子目录中的匹配将被丢弃。

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;
}

【讨论】:

  • 非常感谢!这行得通!我会尽快接受你的回答!
【解决方案2】:

你需要更多地研究递归,你没有将 $array 传递给递归调用,所以你实际上只得到第一个,所有后续调用的结果都丢失了

if(is_dir($dir.'/'.$ff)){
    listFolderFiles($dir.'/'.$ff);
}

对 listFolderFiles 的调用需要将这些文件添加到当前的 $array 中,并且需要将 $array 传递给后续调用。阅读更多递归..

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-16
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多