阵列推送似乎不起作用

时间:2014-04-17 08:14:31

标签: php arrays function output array-push

$files = array();

function listFolderFiles($dir){
    $ffs = scandir($dir);
    echo '<ol>';

    foreach($ffs as $ff){
        if($ff != '.' && $ff != '..'){
            if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff);
            else echo '<li>'.$ff;

            array_push($files, array('file' => $dir.'/'.$ff, 'hash' => hash_file('md5', $dir.'/'.$ff)));
            echo '</li>';
        } 
    }
    echo '</ol>';
}

listFolderFiles('/var/www');
var_dump($files);

为什么我在这里得到空输出?

array(0) { };

4 个答案:

答案 0 :(得分:6)

这是一个范围问题。您的$files数组变量不在您的函数中。

您需要将其作为参数作为参考(由@Barmar ;)提示)传递给它..

正确的方式..

function listFolderFiles($dir,&$files){

并将其称为.. listFolderFiles('/var/www',$files);

您将它作为引用传递,因为您没有返回数组,因此在函数内部对数组所做的任何更改都将保留在那里。因此,您需要添加引用,如方法签名中所示。这将修改原始数组本身。

答案 1 :(得分:3)

您可以通过引用传递变量,如Shankar的答案。或者您可以让函数返回结果:

$files = listFolderFiles($dir);    

function listFolderFiles($dir){
    $files = array();
    $ffs = scandir($dir);
    echo '<ol>';

    foreach($ffs as $ff){
        if($ff != '.' && $ff != '..'){
            if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff);
            else echo '<li>'.$ff;

            array_push($files, array('file' => $dir.'/'.$ff, 'hash' => hash_file('md5', $dir.'/'.$ff)));
            echo '</li>';
        } 
    }
    echo '</ol>';
    return $files;
}

答案 2 :(得分:0)

为了您的目的,最好在函数本身内声明files变量,并在结尾处返回它。这样,该功能将可重复使用:

function listFolderFiles($dir){
    $files = array();
    $ffs = scandir($dir);
    echo '<ol>';

    foreach($ffs as $ff){
        if($ff != '.' && $ff != '..'){
            if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff);
            else echo '<li>'.$ff;

            array_push($files, array('file' => $dir.'/'.$ff, 'hash' => hash_file('md5', $dir.'/'.$ff)));
            echo '</li>';
        } 
    }
    echo '</ol>';
    return $files;
}

$files = listFolderFiles('/var/www');
var_dump($files);

答案 3 :(得分:-1)

你可以使用全局

function listFolderFiles($dir){

global $files; // global var

    $ffs = scandir($dir);

    echo '<ol>';
    foreach($ffs as $ff){

        if($ff != '.' && $ff != '..'){

            if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff);
            else echo '<li>'.$ff;
            array_push($files, array('file' => $dir.'/'.$ff, 'hash' => hash_file('md5', $dir.'/'.$ff)));
            echo '</li>';

        }