PHP:foreach inside while loop只返回一个结果


PHP: foreach inside while loop returning only one result

在PHP中尝试在一段时间内执行foreach循环时遇到问题。 我正在从数据库表中提取构建名称。 这些内部版本名称恰好是文件夹名称。 这些文件夹中有一个文件夹(客户端或客户端),其中是以客户业务名称命名的文件夹。 我希望脚本向我显示构建名称(已经通过 echo 完成),然后在构建名称下方列出每个文件夹。

$build_grab = mysql_query("SELECT b_id,b_name FROM builds", $link);
while($build_row = mysql_fetch_array($build_grab))
{
  $b_id = $build_row['b_id'];
  $b_name = $build_row['b_name'];
  $client_dir = is_dir("/somepath/builds/$b_name/Client/");
  $clients_dir = is_dir("/somepath/builds/$b_name/Clients/");
  if ($client_dir == '1') {
    $client_folders = explode(",", exec("ls -1 /somepath/builds/$b_name/Client/"));
  } elseif ($clients_dir == '1') {
    $client_folders = str_replace("'n","", explode(",", exec("ls -1 /somepath/builds/$b_name/Clients/")));
  };
  echo $b_name;
  echo "'r'n";
  foreach($client_folders as $folder)
  {
    echo $folder;
    echo "'r'n";
  }
}

不幸的是,这似乎每次构建只给我一 (1) 个客户端文件夹名称,并且它始终是文件夹中的最后一个客户端 (a-z)。

示例输出:

build-4.0.0.0
客户端-f
构建-4.0.0.1
客户端-d
构建-4.0.0.2
客户端-j

我在这里错过了什么,或者更好的是,有没有更有效的方法可以做到这一点? 任何帮助将不胜感激!

每次都要

替换 $client_folder 变量。您想在进入 while 循环之前将其创建为数组,然后执行此操作

if ($client_dir == '1') {
  $client_folders[] = explode(",", exec("ls -1 /somepath/builds/$b_name/Client/"));
} elseif ($clients_dir == '1') {
  $client_folders[] = str_replace("'n","", explode(",", exec("ls -1 /somepath/builds/$b_name/Clients/")));
};

顺便说一句,这只会输入第一个 IF,因为第二个完全相同

而不是使用

$client_folders = str_replace("'n","", explode(",", exec("ls -1 /somepath/builds/$b_name/Clients/")));

我建议使用以下代码列出文件夹。

if ($folderHandle = opendir(clients_dir)) {
    while ($file = readdir($folderHandle) {
        echo "$file'n";
    }
    closedir($folderHandle);
}

您可以将该代码更改为有条件的代码,但它应该为您提供一个很好的列表。

exec()只返回命令输出的最后一行。您应该使用本机 PHP 函数来读取目录列表 - opendir/readdirglob 都可以。

if ($client_dir == '1') {
  $client_folders = glob("/somepath/builds/$b_name/Client/*", GLOB_ONLYDIR);
} elseif ($clients_dir == '1') {
  $client_folders = glob("/somepath/builds/$b_name/Clients/*", GLOB_ONLYDIR);
};

非常感谢麦克拉姆利,你关于使用"glob"的建议修复了它! 对不起,克鲁姆利,我显然是新手投票支持你的回应。 也许其他用户可以帮助解决这个问题。
也感谢Chris建议mysqli,我将从这里开始用它编码,这里的后期采用者。

在解决问题的新代码下方。

$build_grab = $mysqli->query("SELECT b_id,b_name FROM builds");
  while($build_row = $build_grab->fetch_array())
{
  $b_id = $build_row['b_id'];
  $b_name = $build_row['b_name'];
  $client_dir = is_dir("/somepath/builds/$b_name/Client/");
  $clients_dir = is_dir("/somepath/builds/$b_name/Clients/");
  if ($client_dir == '1') {
    $client_folders = glob("/somepath/builds/$b_name/Client/*", GLOB_ONLYDIR);
  } elseif ($clients_dir == '1') {
    $client_folders = glob("/somepath/builds/$b_name/Clients/*", GLOB_ONLYDIR);
  };
  echo $b_name;
  echo "'r'n";
  foreach($client_folders as $folder)
  {
    echo $folder;
    echo "'r'n";
  }
}

再次感谢大家的帮助!