【问题标题】:Using scandir on array of directories在目录数组上使用 scandir
【发布时间】:2014-06-10 18:22:12
【问题描述】:

我想传入一个包含要扫描的目录列表的数组。我想遍历每个目录并将其内容推送到另一个我将打印出来的数组中,但由于某种原因我的代码无法正常工作。目录存在且路径正确。我认为这与我使用 foreach 的方式有关。

这些是我得到的错误:

注意:未定义索引:C:\Users\john\Desktop\files\images\ in C:\xampp\htdocs\test.php 在第 6 行

警告:scandir():目录名不能为空 C:\xampp\htdocs\test.php 在第 6 行

这是代码:

function test($dir = []) {
    foreach($dir as $bar) {
        $list = [];
        array_push($list, scandir($dir[$bar]));
    }

    print_r($list);
}

test(["C:\Users\john\Desktop\files\images\\", "C:\Users\john\Desktop\files\images\autumn\\"]);

如果有人能想到更简单的方法,请随时告诉我。

【问题讨论】:

  • PHP 的 foreach 不像 JavaScript 的 for in 语句; $bar 将是实际元素,而不是元素的键。
  • $dir 长什么样子?
  • @TimCooper:好吧。但我只看到第二个目录的内容。我把它改成了foreach($dir as $bar) { $list = []; array_push($list, scandir($bar)); } - 对吗?
  • 您正在为每个目录重置$list。将$list 移出foreach
  • 您只想调用scandir($bar) 并使用array_merge() 将结果附加到$list。在您当前的表单中,每次迭代都会重置列表的内容。请注意,如果您想遍历键和值,可以使用 foreach ($array as $key => $value) 语法,但我认为这里不需要。

标签: php


【解决方案1】:

你在正确的轨道上。不过,您需要进行一些更改。

function test($dir = []) {
    $list = [];
    foreach($dir as $bar) {
        $list[] = scandir($bar);
    }  
    print_r($list);
}

正如 @BrianPoole 所述,您需要将$list 移出foreach 循环。通过将其置于循环中,每次迭代都会重置数组,从而使最终数组具有一个元素。

此外,@TimCooper 解释的 foreach 循环的运行方式与 JavaScript 中的不同。如果您真的想访问密钥,可以使用以下语法:

foreach($dir as $key => $bar)

然后您可以使用$dir[$key]$bar 来访问目录值。

最后,array_push 是在您的情况下不需要的附加函数调用。只需添加[],PHP 就会将新值推送到数组的末尾。

【讨论】:

    【解决方案2】:
    function test($dir) {
        // DEFINE LIST OUT SIDE OF LOOP
        $list = array();
        // Run checks
        if(count($dir) > 0) {
            // Loop Through Directory
            foreach($dir as $directory) {
                // Push into list
                array_push($list, array("scanned"=>$directory, "contents" => scandir($directory)));
            }
        }else {
            // If no directories are passed return array with error
            $list = array(
                "error" => 1,
                "message" => "No directories where passed into test()",
            );
        }
        print_r($list);
    }
    

    我会这样做。它提供了一些检查和设置数据,以便您可以更清楚地设置它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2010-10-11
      • 2012-08-06
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多