Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在目录数组上使用scandir_Php - Fatal编程技术网

Php 在目录数组上使用scandir

Php 在目录数组上使用scandir,php,Php,我想传入一个数组,其中包含要扫描的目录列表。我想迭代每个目录,并将其内容推送到另一个数组中,然后打印出来,但由于某些原因,我的代码无法工作。目录存在并且路径正确。我想这与我如何使用foreach有关 以下是我遇到的错误: 注意:未定义的索引:C:\Users\john\Desktop\files\images\in 第6行的C:\xampp\htdocs\test.php 警告:scandir():目录名在中不能为空 第6行的C:\xampp\htdocs\test.php 代码如下: 如果有

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

以下是我遇到的错误:

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

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

代码如下:


如果有人能想出一个更简单的方法,请毫不犹豫地告诉我。

你走对了方向。不过,您需要做一些更改

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\u push
是一个在您的情况下不需要的附加函数调用。通过简单地添加
[]
PHP将把新值推送到数组的末尾

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

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

PHP的
foreach
与JavaScript的
for in
语句不同
$bar
将是实际的元素,而不是元素的键。
$dir
看起来像什么?@TimCooper:好的。但我只看到了第二个目录的内容。我将其更改为
foreach($dir作为$bar){$list=[];array_push($list,scandir($bar))}
-这是否正确?您正在对每个目录重置
$list
。将
$list
移出
foreach
。只需调用
scandir($bar)
并使用array\u merge()将结果附加到$list。在当前表单中,每次迭代都要重置列表的内容。请注意,如果您想迭代键和值,则有
foreach($key=>array$value)
语法,但我认为这里不需要这样做。
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);
}