非法字符串偏移'结果'在php echo中

时间:2014-10-13 03:55:05

标签: php arrays string

function RetrieveAllPages() {
    $dir = '../pages';
     $root = scandir($dir); 
     $result = array();
    foreach($root as $value){ 
        if($value === '.' || $value === '..') {
            continue;
        } 
        if(is_file("$dir/$value")) {
            $result[]="$dir/$value";
            continue;
        } 
        foreach(find_all_files("$dir/$value") as $value){ 
            $result[]=array('filename'  => $value,);
        } 

    } 
    print_r ($result);
    var_dump($result);
    return $result; 
}


<?php
     //echo'<select>';
     foreach (RetrieveAllPages() as $value){
     //echo "<option value='".$value['rolename']."'>".$value['rolename']."</option>";
     echo'<input  type="checkbox" value='.$value['result'].' name='.$value['result'].'/>';
     }  
     //echo'</select>';
?>

在PHP中获取此类错误代码在上面我有研究,无法找到适合解决方案的任何来源。任何建议或想法是适用的

UPDATE

function RetrieveAllPages() {
    $result = array();
    $dir = "../pages";
    $dh  = opendir($dir);
    while (false !== ($filename = readdir($dh))) {
        $files[] = $filename;
    }
    print_r ($result);
    var_dump($result);
    return $result; 
}

结果为Array ( ) array(0) { }

2 个答案:

答案 0 :(得分:1)

如果您不想递归列出文件,可以使用它。

function RetrieveAllPages() {
    $dir = '../pages';
    $root = scandir($dir); 
    $result = array();
    foreach($root as $value){ 
        if($value === '.' || $value === '..') {
            continue;
        } 
        if(is_file("$dir/$value")) {
            $result[]="$dir/$value";
        }
        //Note: removed the recursive call
    } 
    print_r ($result);
    var_dump($result);
    return $result; 
}

 //echo'<select>';
 foreach (RetrieveAllPages() as $value){
 //echo "<option value='".$value['rolename']."'>".$value['rolename']."</option>";
 // Note $value contains the filename!!!
 echo'<input  type="checkbox" value='.$value.' name='.$value.'/>' ;
 }  
 //echo'</select>';

这是另一种更短的方法!使用array_filteranonymous function

 $all_files = array_filter(scandir('../pages'),function($v){return(!($v === '.' || $v === '..'));});
 foreach ($all_files as $value){
     echo'<input  type="checkbox" value='.$value.' name='.$value.'/>' . $value .'<br/>';
 }  

答案 1 :(得分:1)

由于您定义了函数Illegal offset的方式,您收到RetrieveAllPages()错误。从代码中,它基本上扫描根文件夹中的文件和目录。如果它遇到目录,它会尝试查找该目录中的所有文件并将它们推送到您返回的result数组中。

如果在打印result数组时注意到输出,它看起来就像这样(只是一个例子):

 Array ( [0] => foo.jpg [1] => bar.txt [2] => Array ( [filename] => Testfile.pdf ) )

现在您已了解函数返回的内容,让我们回到echo语句:

foreach (RetrieveAllPages() as $value){
   //Here the $value could be either string of the form root/foo etc or 
     echo $value; //String of file directly found in root directory

   //It would be of the form of an array where you would get file names by doing something like:
    echo $value[0]['filename']; //from the nested array

 }

在任何情况下,您都没有在result中创建的数组中的任何位置使用字符串偏移量RetrieveAllPages()。您使用的唯一字符串偏移是filename。这可能是您尝试使用这些值创建复选框时出现此错误的原因。在返回的数组中处理这两种值的方式完全取决于您。

Sidenote - 保存值的方式,您的函数很可能会返回嵌套数组。一种解决方法可能是,如果您遇到目录而不是文件,只需将字符串前缀添加到该目录中找到的文件名,而不是创建前缀为filename的嵌套数组。它会大大简化您创建echo复选框的HTML语句。

就像我说的那样,实施取决于你,取决于你最终想要实现的目标。希望它能让你开始朝着正确的方向前进。