在PHP循环后,数组为空

时间:2018-04-04 18:06:35

标签: php arrays foreach

我正在尝试在特定文件夹中创建ARRAY个文件和子文件夹。我在获取文件和子文件夹列表方面取得了成功,但当我尝试将这些数据保存在ARRAY时,它只在LOOP内显示预期结果。 LOOP完成后return EMPTY

这是完整的代码

<?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
?>
  

感谢大家的支持,但最后我更喜欢使用GLOBAL VARS

3 个答案:

答案 0 :(得分:1)

PHP - Variable scope。在SELECT MAX(BB.SEQNBR) FROM TEST_STATUS BB WHERE BB.USERID = B.USERID and not exists (select 1 from TEST_STATUS cc where ccUSERID = BB.USERID AND cc.STATUS1 = 'CLE') 中定义的$vid在函数内部不可用,并且内部定义的$vid = array();在外部不可用。您可能希望在函数末尾$vid

return

然后分配回报并使用它:

return $vid;

但看起来您与$vid = dirToOptions(); var_dump($vid); 会遇到同样的问题,因此请将其更改为使用$thumb数组:

$vid

答案 1 :(得分:0)

简单的答案是添加以下行:

global $vid;

到你的功能的开头。这会将$ vid的范围扩展到你的函数之外。

虽然,我会建议您按照其他说明操作,然后从函数返回数组。

答案 2 :(得分:-1)

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

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

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