在PHP中,循环后数组为空

在PHP中,循环后数组为空,php,arrays,foreach,Php,Arrays,Foreach,我试图在一个特定的文件夹中创建一个文件和子文件夹的数组。我成功地获得了文件和子文件夹的列表,但当我尝试将这些数据保存在数组中时,它只在循环中显示预期的结果。循环完成后,返回空 这是完整的代码 <?php function dirToOptions($path = '../data/vid/', $level = 0) { $items = scandir($path); $vidCount = 0; $thumbCount = 0; foreach($items a

我试图在一个特定的文件夹中创建一个文件和子文件夹的数组。我成功地获得了文件和子文件夹的列表,但当我尝试将这些数据保存在数组中时,它只在循环中显示预期的结果。循环完成后,返回空

这是完整的代码

<?php
function dirToOptions($path = '../data/vid/', $level = 0) {
    $items = scandir($path);
    $vidCount = 0; $thumbCount = 0;
    foreach($items as $item) {
        // ignore items strating with a dot (= hidden or nav)
        if (strpos($item, '.') === 0) {
            continue;
        }

        $fullPath = $path . DIRECTORY_SEPARATOR . $item;
        // add some whitespace to better mimic the file structure
        $item = str_repeat('&nbsp;', $level * 3) . $item;
        // file
        if (is_file($fullPath)) {
            $rrInt = (int)$level-1;
            if($rrInt == 0){
                $vid['videos'][] = array('name'=>$item, 'link'=>$fullPath);
                echo "<a href='$fullPath'><i for='$rrInt'>$item</i></a><br />";
            }elseif($rrInt == 1){
                $thumb['thumbs'][] = array('name'=>$item, 'link'=>$fullPath);
                echo "<a href='$fullPath'><i for='$rrInt'>$item</i></a><br />";
                var_dump($thumb); //SHOW RESULT HERE
            }
        }
        // dir
        else if (is_dir($fullPath)) {
            // immediatly close the optgroup to prevent (invalid) nested optgroups
            echo "<b label='$level'>$item</b><br />";
            // recursive call to self to add the subitems
            dirToOptions($fullPath, $level + 1);
        }
    }
}

$array = array(); $vid = array(); $thumb = array();

echo '<div>';
dirToOptions();
echo '</div>';

var_dump($vid); // RETURN EMPTY
?>
感谢大家的支持,但最后我更喜欢使用全局变量

看。用$vid=数组定义的$vid;函数内部不可用,内部定义的$vid在外部不可用。您可能希望在函数末尾返回它:

return $vid;
然后分配退货并使用它:

$vid = dirToOptions();
var_dump($vid);
但是看起来$thumb也会有同样的问题,所以将其更改为使用$vid数组:


函数内外的变量是不同的变量,即使它们的名称相同。这就是所谓的变量范围。这样,您的函数在内部保持其所有状态,并且不会意外地影响函数定义之外的任何内容。这使得引入bug变得更加困难,因为您在函数内部和外部使用了相同的变量名

解决方案是在函数内部构建数组后从函数返回值:

function dirToOptions($path = '../data/vid/', $level = 0) {
    $vid = array();

    ....

    return $vid;
}

$vid = dirToOptions();
var_dump($vid);
这样,有关dirToOptions如何工作的所有内容都被隔离,您只处理从函数返回的内容。该函数的接口以及它所做的一切都保持干净,不受任何外部依赖关系的影响

要处理代码的递归部分,请合并每个步骤中返回的值,或者通过引用传递参数。使用引用在方法签名中是显式的,不会盲目地从全局范围创建对变量的引用,并且可以在必要时从其他函数作为局部变量传递

function dirToOptions($path = '../data/vid/', $level = 0) {
    $vid = array();

    ....
    } else {
        // merge this array and the one returned from the child directory
        $vid = array_merge($vid, dirToOptions($fullPath, $level + 1));
    }

    return $vid;
}

$vid = dirToOptions();
。。作为参考:

function dirToOptions(&$vid, $path = '../data/vid/', $level = 0) {
    $vid = array();

    ....
    } else {
        // pass the reference on further down the recursive calls
        dirToOptions($vid, $fullPath, $level + 1);
    }

    return $vid;
}

dirToOptions($vid);

简单的答案是添加一行:

global $vid;
到你的功能的开始。这将把$vid的范围扩展到您的功能之外


不过,我衷心建议您按照其他说明操作,并从函数中返回数组。

嗯。。。什么是$vid?当然它是空的$vid=array它只是一个空变量。您认为内容应该如何到达数组?您没有使用递归调用的返回值。使用全局变量几乎从来都不是首选的解决方案,至少对于这样的东西,它可以很容易地以一种更便于移植和维护的方式编写。再次检查问题的引用部分[刚刚更新]。这不是完整的代码,您没有为$array分配任何内容。我正在分配dude,稍等一下,我现在要更新问题检查BuddyIt对我来说也很奇怪,怎么不起作用?请帮助Dude检查问题的引用部分[刚刚更新],因为使用global是不好的,因为这违背了您的函数的承诺,即它不会改变自身之外的任何内容。如果您确实想做类似的事情,可以通过传递一个变量作为引用来完成。为了将来的参考,我更新了我的答案,向您展示了如何通过引用和保留返回值来解决它。我感谢您的建议,但问题是它在我的情况下不起作用,我不知道为什么。可能是因为您没有考虑代码中的递归函数调用,我已经添加了一些例子。如果您最初编写了这段代码,那么您应该对它的流程有一个相当好的把握。
global $vid;