【问题标题】:Invalid argument supplied for foreach() - using glob为 foreach() 提供的参数无效 - 使用 glob
【发布时间】:2011-05-08 11:22:21
【问题描述】:

今天我的脚本有问题,我的脚本应该搜索(.css 文件)

我使用了一个代码来:

  1. 搜索根文件夹中的所有子文件夹
  2. 在一个数组中创建子文件夹的所有路径
  3. 通过使用 foreach(){glob....},脚本应该找到 css 文件的所有路径

这是我的代码:

$path = '';
$stack[] = $dir;

while ($stack) {
    $thisdir = array_pop($stack);

    if ($dircont = scandir($thisdir)) {
        $i=0;

        while (isset($dircont[$i])) {
            if ($dircont[$i] !== '.' && $dircont[$i] !== '..') {
                $current_file = "{$thisdir}/{$dircont[$i]}";

                if (is_dir($current_file)) {
                    $path[] = "{$thisdir}/{$dircont[$i]}";
                    $stack[] = $current_file;
                }
            }
            $i++;
        }
    }
}

$path[] = $dir;
foreach($path as $dirname){
    $add = glob($dirname . '/*.css');

    foreach($add as $file){
        $code = file_get_contents($file);
        $code_arab = arabicer($code);
        file_put_contents($file,$code_arab);
    }
}

当我开始我的脚本时,我发现了一条减弱的消息:

警告:在第 131 行的 /home/u274517531/public_html/libs/functions.php 中为 foreach() 提供的参数无效

我确定我的数组不为空。

那么,谁能帮我解决这个问题?

谢谢。

【问题讨论】:

    标签: php foreach warnings


    【解决方案1】:

    您说您确定您的数组不为空,但是 为 foreach() 提供的参数无效 错误消息的意思是它甚至不是数组 .不信你自己试试:

    var_dump($add);
    

    很可能,查找文件时出错,glob() 正在返回 FALSE

    返回一个包含 匹配的文件/目录,一个空的 如果没有文件匹配或 FALSE on 错误。

    【讨论】:

    • 查看我对答案 #2 的评论 :)
    • 没错,但问题是我怎样才能使函数 glob() 工作?我确定目录中有一个css文件。谢谢大家。
    【解决方案2】:

    改变这个:

    $path[] = $dir;
    foreach($path as $dirname){
        $add = glob($dirname . '/*.css');
        foreach($add as $file){
    

    到这里:

    $path[] = $dir;
    var_dump($path);
    foreach($path as $dirname){
        $add = glob($dirname . '/*.css');
        var_dump($add);
        foreach($add as $file){
    

    我们不知道第 131 行是哪一行,所以我不知道哪个 foreach 失败了。

    (我猜是第二个,因为第一个实际上是由$path[] = .. 强制排列的)

    【讨论】:

    • 感谢您的回答,我做了 ==> 第一个数组 $path[] 是获取此信息 --> array(3) { [0]=> string(26) "../uploads /newtest/newtest" [1]=> string(55) "../uploads/newtest/newtest/newtest - 复制 - 复制 - 复制" [2]=> string(18) "../uploads/newtest" } ||||第二个数组 $add[] 返回了这个信息 --> bool(false) ||第 131 行现在是 #139 和它的第二个 foreach
    • 那么您现在知道问题及其解决方案了吧? $dirname 不是(可读的)目录或其他东西。 glob 失败。 var_dump($dirname) 可以肯定。 var_dump 是你最好的朋友。 PHP = 调试
    • 我试过 var_dump($dirname); ,它得到了我的目录名称,它有效,$add 中的问题,我不知道为什么脚本找不到 CSS 文件,我确定目录中有一个 css 文件(/uploads/newtest/newtest/ newtest - Copy - Copy - Copy) ,你有什么信息可以让 glob() 工作吗?
    • 如果$dirname 是一个可读的目录,那么有多少.css 文件并不重要:它应该总是返回一个数组。当我在本地尝试var_dump(glob('/SERVER/*.css')); 时响应:array(0) { }var_dump($dirname)字面意思打印什么?
    • string(23) "uploads/newtest/newtest" === NEXT LINE === 警告:在 /home/u274517531/public_html/libs/functions.php 中为 foreach() 提供的参数无效第141行===下一行===字符串(52)“上传/新测试/新测试/新测试-复制-复制-复制”====下一行===字符串(15)“上传/新测试”=== ================================================= 第 141 行内容是:foreach($add as $file){
    【解决方案3】:

    我今天在一个 PHP 脚本中发现了同样的问题,它需要从 foreach 循环切换到 for 循环来修复它。不知道是什么意思,数组的外观和工作方式相同。

    // Errors out
    $files = glob($directory.'*.html');
    foreach($files as $file){
        echo($file);
    }
    
    // No error
    $files = glob($directory.'*.html');
    for($i=0; $i<count($files); $i++){
        echo($files[$i]);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 2011-02-07
      相关资源
      最近更新 更多